Initial commit
This commit is contained in:
		
						commit
						6febcff39d
					
				
							
								
								
									
										8
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					Prerequisites:
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					Nginx
 | 
				
			||||||
 | 
					Mariadb
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TODO:
 | 
				
			||||||
 | 
					max_days configure in script
 | 
				
			||||||
							
								
								
									
										277
									
								
								ejabberd.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										277
									
								
								ejabberd.yml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,277 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					###
 | 
				
			||||||
 | 
					###              ejabberd configuration file
 | 
				
			||||||
 | 
					###
 | 
				
			||||||
 | 
					### The parameters used in this configuration file are explained at
 | 
				
			||||||
 | 
					###
 | 
				
			||||||
 | 
					###       https://docs.ejabberd.im/admin/configuration
 | 
				
			||||||
 | 
					###
 | 
				
			||||||
 | 
					### The configuration file is written in YAML.
 | 
				
			||||||
 | 
					### *******************************************************
 | 
				
			||||||
 | 
					### *******           !!! WARNING !!!               *******
 | 
				
			||||||
 | 
					### *******     YAML IS INDENTATION SENSITIVE       *******
 | 
				
			||||||
 | 
					### ******* MAKE SURE YOU INDENT SECTIONS CORRECTLY *******
 | 
				
			||||||
 | 
					### *******************************************************
 | 
				
			||||||
 | 
					### Refer to http://en.wikipedia.org/wiki/YAML for the brief description.
 | 
				
			||||||
 | 
					###
 | 
				
			||||||
 | 
					define_macro:
 | 
				
			||||||
 | 
					  BACKLOG: 50
 | 
				
			||||||
 | 
					  DH_FILE: /etc/ssl/dh2048.pem
 | 
				
			||||||
 | 
					  CIPHERS: "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256"
 | 
				
			||||||
 | 
					  TLS_OPTIONS:
 | 
				
			||||||
 | 
					    - "no_sslv2"
 | 
				
			||||||
 | 
					    - "no_sslv3"
 | 
				
			||||||
 | 
					    - "no_tlsv1"
 | 
				
			||||||
 | 
					    - "no_tlsv1_1"
 | 
				
			||||||
 | 
					    - "cipher_server_preference"
 | 
				
			||||||
 | 
					    - "no_compression"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hosts:
 | 
				
			||||||
 | 
					  - ksi.xyz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loglevel: info
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					acme:
 | 
				
			||||||
 | 
					  auto: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					certfiles:
 | 
				
			||||||
 | 
					  - FILL IN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					c2s_ciphers: TLS_CIPHERS
 | 
				
			||||||
 | 
					c2s_protocol_options: TLS_OPTIONS
 | 
				
			||||||
 | 
					c2s_dhfile: DH_FILE
 | 
				
			||||||
 | 
					s2s_ciphers: TLS_CIPHERS
 | 
				
			||||||
 | 
					s2s_protocol_options: TLS_OPTIONS
 | 
				
			||||||
 | 
					s2s_dhfile: DH_FILE
 | 
				
			||||||
 | 
					s2s_use_starttls: required
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					listen:
 | 
				
			||||||
 | 
					  -
 | 
				
			||||||
 | 
					    port: 5222
 | 
				
			||||||
 | 
					    ip: "::"
 | 
				
			||||||
 | 
					    module: ejabberd_c2s
 | 
				
			||||||
 | 
					    max_stanza_size: 262144    
 | 
				
			||||||
 | 
					    starttls: true
 | 
				
			||||||
 | 
					    starttls_required: false
 | 
				
			||||||
 | 
					    tls_compression: false
 | 
				
			||||||
 | 
					    shaper: c2s_shaper
 | 
				
			||||||
 | 
					    access: c2s
 | 
				
			||||||
 | 
					    backlog: BACKLOG
 | 
				
			||||||
 | 
					  -
 | 
				
			||||||
 | 
					    port: 5223
 | 
				
			||||||
 | 
					    ip: "::"
 | 
				
			||||||
 | 
					    tls: true
 | 
				
			||||||
 | 
					    backlog: BACKLOG
 | 
				
			||||||
 | 
					    module: ejabberd_c2s
 | 
				
			||||||
 | 
					    max_stanza_size: 262144
 | 
				
			||||||
 | 
					    shaper: c2s_shaper
 | 
				
			||||||
 | 
					    access: c2s
 | 
				
			||||||
 | 
					    tls_compression: false
 | 
				
			||||||
 | 
					  -
 | 
				
			||||||
 | 
					    port: 5269
 | 
				
			||||||
 | 
					    ip: "::"
 | 
				
			||||||
 | 
					    module: ejabberd_s2s_in
 | 
				
			||||||
 | 
					    max_stanza_size: 524288
 | 
				
			||||||
 | 
					    tls_compression: false
 | 
				
			||||||
 | 
					  -
 | 
				
			||||||
 | 
					    port: 5270
 | 
				
			||||||
 | 
					    ip: "::"
 | 
				
			||||||
 | 
					    backlog: BACKLOG
 | 
				
			||||||
 | 
					    module: ejabberd_s2s_in
 | 
				
			||||||
 | 
					    max_stanza_size: 524288
 | 
				
			||||||
 | 
					    tls_compression: false
 | 
				
			||||||
 | 
					  -
 | 
				
			||||||
 | 
					    port: 5280
 | 
				
			||||||
 | 
					    ip: "::"
 | 
				
			||||||
 | 
					    module: ejabberd_http
 | 
				
			||||||
 | 
					    request_handlers:
 | 
				
			||||||
 | 
					      /admin: ejabberd_web_admin
 | 
				
			||||||
 | 
					      /.well-known/acme-challenge: ejabberd_acme
 | 
				
			||||||
 | 
					      /upload: mod_http_upload
 | 
				
			||||||
 | 
					  -
 | 
				
			||||||
 | 
					    port: 3478
 | 
				
			||||||
 | 
					    ip: "::"
 | 
				
			||||||
 | 
					    transport: udp
 | 
				
			||||||
 | 
					    module: ejabberd_stun
 | 
				
			||||||
 | 
					    use_turn: true
 | 
				
			||||||
 | 
					  -
 | 
				
			||||||
 | 
					    port: 1883
 | 
				
			||||||
 | 
					    ip: "::"
 | 
				
			||||||
 | 
					    module: mod_mqtt
 | 
				
			||||||
 | 
					    backlog: 1000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					auth_method: sql
 | 
				
			||||||
 | 
					default_db: sql
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sql_type: mysql
 | 
				
			||||||
 | 
					sql_server: "localhost"
 | 
				
			||||||
 | 
					sql_database: "ejabberd"
 | 
				
			||||||
 | 
					sql_username: "ejabberd"
 | 
				
			||||||
 | 
					sql_password: "password"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					acl:
 | 
				
			||||||
 | 
					  admin:
 | 
				
			||||||
 | 
					    user: admin@domain.tld
 | 
				
			||||||
 | 
					  local:
 | 
				
			||||||
 | 
					    user_regexp: ""
 | 
				
			||||||
 | 
					  loopback:
 | 
				
			||||||
 | 
					    ip:
 | 
				
			||||||
 | 
					      - 127.0.0.0/8
 | 
				
			||||||
 | 
					      - ::1/128
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					access_rules:
 | 
				
			||||||
 | 
					  configure:
 | 
				
			||||||
 | 
					    allow: admin # only allow an admin to configure the server
 | 
				
			||||||
 | 
					  local:
 | 
				
			||||||
 | 
					    allow: local
 | 
				
			||||||
 | 
					  c2s:
 | 
				
			||||||
 | 
					    allow: all
 | 
				
			||||||
 | 
					    deny: blocked
 | 
				
			||||||
 | 
					  announce:
 | 
				
			||||||
 | 
					    allow: admin # only allow an admin to send announcements
 | 
				
			||||||
 | 
					  muc_create:
 | 
				
			||||||
 | 
					    allow: admin # only allow an admin to create MUCs
 | 
				
			||||||
 | 
					  pubsub_createnode:
 | 
				
			||||||
 | 
					    allow: local
 | 
				
			||||||
 | 
					  trusted_network:
 | 
				
			||||||
 | 
					    allow: loopback
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					api_permissions:
 | 
				
			||||||
 | 
					  "console commands":
 | 
				
			||||||
 | 
					    from:
 | 
				
			||||||
 | 
					      - ejabberd_ctl
 | 
				
			||||||
 | 
					    who: all
 | 
				
			||||||
 | 
					    what: "*"
 | 
				
			||||||
 | 
					  "admin access":
 | 
				
			||||||
 | 
					    who:
 | 
				
			||||||
 | 
					      access:
 | 
				
			||||||
 | 
					        allow:
 | 
				
			||||||
 | 
					          - acl: loopback
 | 
				
			||||||
 | 
					          - acl: admin
 | 
				
			||||||
 | 
					      oauth:
 | 
				
			||||||
 | 
					        scope: "ejabberd:admin"
 | 
				
			||||||
 | 
					        access:
 | 
				
			||||||
 | 
					          allow:
 | 
				
			||||||
 | 
					            - acl: loopback
 | 
				
			||||||
 | 
					            - acl: admin
 | 
				
			||||||
 | 
					    what:
 | 
				
			||||||
 | 
					      - "*"
 | 
				
			||||||
 | 
					      - "!stop"
 | 
				
			||||||
 | 
					      - "!start"
 | 
				
			||||||
 | 
					  "public commands":
 | 
				
			||||||
 | 
					    who:
 | 
				
			||||||
 | 
					      ip: 127.0.0.1/8
 | 
				
			||||||
 | 
					    what:
 | 
				
			||||||
 | 
					      - status
 | 
				
			||||||
 | 
					      - connected_users_number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					shaper:
 | 
				
			||||||
 | 
					  normal:
 | 
				
			||||||
 | 
					    rate: 1000000 # For Monal it was rather low, we only have 30 seconds for handling a push notification (Loading all messages that are pending from the server).
 | 
				
			||||||
 | 
					    burst_size: 5000000 # Same as above. I opted for rather large values, may be a bit to high depending on your server
 | 
				
			||||||
 | 
					  fast: 50000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					shaper_rules:
 | 
				
			||||||
 | 
					  max_user_sessions: 10
 | 
				
			||||||
 | 
					  max_user_offline_messages:
 | 
				
			||||||
 | 
					    5000: admin
 | 
				
			||||||
 | 
					    1000: all
 | 
				
			||||||
 | 
					  c2s_shaper:
 | 
				
			||||||
 | 
					    none: admin
 | 
				
			||||||
 | 
					    normal: all
 | 
				
			||||||
 | 
					  s2s_shaper: fast
 | 
				
			||||||
 | 
					  soft_upload_quota:
 | 
				
			||||||
 | 
					    3700: all # MB
 | 
				
			||||||
 | 
					  hard_upload_quota:
 | 
				
			||||||
 | 
					    4000: all # MB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					modules:
 | 
				
			||||||
 | 
					  mod_adhoc: {}
 | 
				
			||||||
 | 
					  mod_admin_extra: {}
 | 
				
			||||||
 | 
					  mod_announce:
 | 
				
			||||||
 | 
					    access: announce
 | 
				
			||||||
 | 
					  mod_avatar: {}
 | 
				
			||||||
 | 
					  mod_blocking: {}
 | 
				
			||||||
 | 
					  mod_bosh: {}
 | 
				
			||||||
 | 
					  mod_caps: {}
 | 
				
			||||||
 | 
					  mod_carboncopy: {}
 | 
				
			||||||
 | 
					  mod_client_state: {}
 | 
				
			||||||
 | 
					  mod_configure: {}
 | 
				
			||||||
 | 
					  mod_disco: {}
 | 
				
			||||||
 | 
					  mod_fail2ban: {}
 | 
				
			||||||
 | 
					  mod_http_api: {}
 | 
				
			||||||
 | 
					  mod_http_upload:
 | 
				
			||||||
 | 
					    put_url: "https://upload./upload/@HOST@"
 | 
				
			||||||
 | 
					    hosts:
 | 
				
			||||||
 | 
					      - upload.
 | 
				
			||||||
 | 
					    custom_headers:
 | 
				
			||||||
 | 
					      "Access-Control-Allow-Origin": "*"
 | 
				
			||||||
 | 
					      "Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
 | 
				
			||||||
 | 
					      "Access-Control-Allow-Headers": "Content-Type"
 | 
				
			||||||
 | 
					  #mod_http_upload_quota:
 | 
				
			||||||
 | 
					    #max_days: 100 # 100 days until content is deleted
 | 
				
			||||||
 | 
					  mod_last: {}
 | 
				
			||||||
 | 
					  mod_mam:
 | 
				
			||||||
 | 
					    ## Mnesia is limited to 2GB, better to use an SQL backend
 | 
				
			||||||
 | 
					    ## For small servers SQLite is a good fit and is very easy
 | 
				
			||||||
 | 
					    ## to configure. Uncomment this when you have SQL configured:
 | 
				
			||||||
 | 
					    db_type: sql
 | 
				
			||||||
 | 
					    assume_mam_usage: true
 | 
				
			||||||
 | 
					    default: always
 | 
				
			||||||
 | 
					  mod_mqtt: {}
 | 
				
			||||||
 | 
					  mod_muc:
 | 
				
			||||||
 | 
					    access:
 | 
				
			||||||
 | 
					      - allow
 | 
				
			||||||
 | 
					    access_admin:
 | 
				
			||||||
 | 
					      - allow: admin
 | 
				
			||||||
 | 
					    access_create: muc_create
 | 
				
			||||||
 | 
					    access_persistent: muc_create
 | 
				
			||||||
 | 
					    access_mam:
 | 
				
			||||||
 | 
					      - allow
 | 
				
			||||||
 | 
					    default_room_options:
 | 
				
			||||||
 | 
					      mam: true
 | 
				
			||||||
 | 
					  mod_muc_admin: {}
 | 
				
			||||||
 | 
					  mod_offline:
 | 
				
			||||||
 | 
					    access_max_user_messages: max_user_offline_messages
 | 
				
			||||||
 | 
					  mod_ping: {}
 | 
				
			||||||
 | 
					  mod_privacy: {}
 | 
				
			||||||
 | 
					  mod_private: {}
 | 
				
			||||||
 | 
					  mod_proxy65:
 | 
				
			||||||
 | 
					    access: local
 | 
				
			||||||
 | 
					    max_connections: 5
 | 
				
			||||||
 | 
					  mod_pubsub:
 | 
				
			||||||
 | 
					    access_createnode: pubsub_createnode
 | 
				
			||||||
 | 
					    plugins:
 | 
				
			||||||
 | 
					      - flat
 | 
				
			||||||
 | 
					      - pep
 | 
				
			||||||
 | 
					    force_node_config:
 | 
				
			||||||
 | 
					      ## Avoid buggy clients to make their bookmarks public
 | 
				
			||||||
 | 
					      "eu.siacs.conversations.axolotl.*":
 | 
				
			||||||
 | 
					        access_model: open
 | 
				
			||||||
 | 
					      storage:bookmarks:
 | 
				
			||||||
 | 
					        access_model: whitelist
 | 
				
			||||||
 | 
					  mod_push: {}
 | 
				
			||||||
 | 
					  mod_push_keepalive: {}
 | 
				
			||||||
 | 
					  mod_register:
 | 
				
			||||||
 | 
					    ## Only accept registration requests from the "trusted"
 | 
				
			||||||
 | 
					    ## network (see access_rules section above).
 | 
				
			||||||
 | 
					    ## Think twice before enabling registration from any
 | 
				
			||||||
 | 
					    ## address. See the Jabber SPAM Manifesto for details:
 | 
				
			||||||
 | 
					    ## https://github.com/ge0rg/jabber-spam-fighting-manifesto
 | 
				
			||||||
 | 
					    ip_access: trusted_network
 | 
				
			||||||
 | 
					  mod_roster:
 | 
				
			||||||
 | 
					    versioning: true
 | 
				
			||||||
 | 
					  mod_s2s_dialback: {}
 | 
				
			||||||
 | 
					  mod_shared_roster: {}
 | 
				
			||||||
 | 
					  mod_stream_mgmt:
 | 
				
			||||||
 | 
					    resend_on_timeout: if_offline
 | 
				
			||||||
 | 
					  mod_stun_disco: {}
 | 
				
			||||||
 | 
					  mod_vcard: {}
 | 
				
			||||||
 | 
					  mod_vcard_xupdate: {}
 | 
				
			||||||
 | 
					  mod_version:
 | 
				
			||||||
 | 
					    show_os: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Local Variables:
 | 
				
			||||||
 | 
					### mode: yaml
 | 
				
			||||||
 | 
					### End:
 | 
				
			||||||
 | 
					### vim: set filetype=yaml tabstop=8
 | 
				
			||||||
							
								
								
									
										885
									
								
								xmpp-wizard.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										885
									
								
								xmpp-wizard.sh
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,885 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					sqldb="ejabberd"
 | 
				
			||||||
 | 
					sqlusername="ejabberd"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pacman -S --noconfirm ejabberd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					domains=("conference.$domain" "proxy.$domain" "pubsub.$domain" "upload.$domain")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					certdirs=("/etc/letsencrypt/live/$domain" "/etc/letsencrypt/live/${domains[0]}" "/etc/letsencrypt/live/${domains[1]}" "/etc/letsencrypt/live/${domains[2]}" "/etc/letsencrypt/live/${domains[3]}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					read -p "Enter your domain: " domain
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					index=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 try to find any existing certificates for the various vhosts required by
 | 
				
			||||||
 | 
					 ejabberd, otherwise retrieve them via certbot
 | 
				
			||||||
 | 
					for $vhost in ${domains[@]}; do # for each vhost
 | 
				
			||||||
 | 
					    [ ! -d "$certdir[$index]" ] && # if default cert dir for the vhost doesn't exist
 | 
				
			||||||
 | 
					        certdir[$index]=$(certbot certificates 2>/dev/null | grep "Domains:.* \(\*\.$domain\|$vhost\)\(\s\|$\)" -A 2 | awk '/Certificate Path/ {print $3}' | head -n1) # set cert dir for certificate
 | 
				
			||||||
 | 
					    ((index++))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [ ! -d "$certdir[$index]" ] && # if there is no certificate for the domain 
 | 
				
			||||||
 | 
					        case "$(netstat -tulpn | grep ":80\s")" in
 | 
				
			||||||
 | 
					            *nginx*) # if nginx is running
 | 
				
			||||||
 | 
					                pacman -S --noconfirm python3-certbot-nginx
 | 
				
			||||||
 | 
					                certbot -d "$vhost" certonly --nginx --register-unsafely-without-email --agree-tos # request cert with nginx
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					            #*apache*) # if apache is running
 | 
				
			||||||
 | 
					            #    pacman -S --noconfirm python3-certbot-apache
 | 
				
			||||||
 | 
					            #    certbot -d "$vhost" certonly --apache --register-unsafely-without-email --agree-tos # request cert with apache
 | 
				
			||||||
 | 
					            #    ;;
 | 
				
			||||||
 | 
					            *) # otherwise
 | 
				
			||||||
 | 
					                pacman -S --noconfirm certbot
 | 
				
			||||||
 | 
					                certbot -d "$vhost" certonly --standalone --register-unsafely-without-email --agree-tos # request cert with certbot
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
 | 
					    esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [ ! -d "$certdir[$index]" ] && echo "Error locating or installing SSL certificate." && exit 1
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					read -p "Enter the username for the admin user: " adminusername
 | 
				
			||||||
 | 
					while read -p "$adminusername@$domain is this correct? (y/n): " confirm; do
 | 
				
			||||||
 | 
					    if [ "$confirm" == "y" ]; then
 | 
				
			||||||
 | 
					        break
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        read -p "Enter the username for the admin user: " adminusername
 | 
				
			||||||
 | 
					        continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					read -p "Enter the password for the ejabberd SQL user: " sqlpassword
 | 
				
			||||||
 | 
					while read -p "$adminpassword is this correct? (y/n): " confirm; do
 | 
				
			||||||
 | 
					    if [ "$confirm" == "y" ]; then
 | 
				
			||||||
 | 
					        break
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        read -p "Enter the password for the ejabberd SQL user: " sqlpassword
 | 
				
			||||||
 | 
					        continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mariadb -e "CREATE DATABASE $sqldb; CREATE USER $sqlusername@localhost IDENTIFIED BY '$sqlpassword'; GRANT ALL ON ejabberd.* TO $sqlusername@localhost"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- ejabberd, Copyright (C) 2002-2023   ProcessOne
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- This program is free software; you can redistribute it and/or
 | 
				
			||||||
 | 
					-- modify it under the terms of the GNU General Public License as
 | 
				
			||||||
 | 
					-- published by the Free Software Foundation; either version 2 of the
 | 
				
			||||||
 | 
					-- License, or (at your option) any later version.
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					-- but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
				
			||||||
 | 
					-- General Public License for more details.
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					-- You should have received a copy of the GNU General Public License along
 | 
				
			||||||
 | 
					-- with this program; if not, write to the Free Software Foundation, Inc.,
 | 
				
			||||||
 | 
					-- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE users (
 | 
				
			||||||
 | 
					    username varchar(191) PRIMARY KEY,
 | 
				
			||||||
 | 
					    password text NOT NULL,
 | 
				
			||||||
 | 
					    serverkey varchar(128) NOT NULL DEFAULT '',
 | 
				
			||||||
 | 
					    salt varchar(128) NOT NULL DEFAULT '',
 | 
				
			||||||
 | 
					    iterationcount integer NOT NULL DEFAULT 0,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- Add support for SCRAM auth to a database created before ejabberd 16.03:
 | 
				
			||||||
 | 
					-- ALTER TABLE users ADD COLUMN serverkey varchar(64) NOT NULL DEFAULT '';
 | 
				
			||||||
 | 
					-- ALTER TABLE users ADD COLUMN salt varchar(64) NOT NULL DEFAULT '';
 | 
				
			||||||
 | 
					-- ALTER TABLE users ADD COLUMN iterationcount integer NOT NULL DEFAULT 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE last (
 | 
				
			||||||
 | 
					    username varchar(191) PRIMARY KEY,
 | 
				
			||||||
 | 
					    seconds text NOT NULL,
 | 
				
			||||||
 | 
					    state text NOT NULl
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE rosterusers (
 | 
				
			||||||
 | 
					    username varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    jid varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    nick text NOT NULL,
 | 
				
			||||||
 | 
					    subscription character(1) NOT NULL,
 | 
				
			||||||
 | 
					    ask character(1) NOT NULL,
 | 
				
			||||||
 | 
					    askmessage text NOT NULL,
 | 
				
			||||||
 | 
					    server character(1) NOT NULL,
 | 
				
			||||||
 | 
					    subscribe text NOT NULL,
 | 
				
			||||||
 | 
					    type text,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_rosteru_user_jid ON rosterusers(username(75), jid(75));
 | 
				
			||||||
 | 
					CREATE INDEX i_rosteru_jid ON rosterusers(jid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE rostergroups (
 | 
				
			||||||
 | 
					    username varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    jid varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    grp text NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE INDEX pk_rosterg_user_jid ON rostergroups(username(75), jid(75));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE sr_group (
 | 
				
			||||||
 | 
					    name varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    opts text NOT NULL,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_sr_group_name ON sr_group(name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE sr_user (
 | 
				
			||||||
 | 
					    jid varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    grp varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_sr_user_jid_group ON sr_user(jid(75), grp(75));
 | 
				
			||||||
 | 
					CREATE INDEX i_sr_user_grp ON sr_user(grp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE spool (
 | 
				
			||||||
 | 
					    username varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    xml mediumtext NOT NULL,
 | 
				
			||||||
 | 
					    seq BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE INDEX i_despool USING BTREE ON spool(username);
 | 
				
			||||||
 | 
					CREATE INDEX i_spool_created_at USING BTREE ON spool(created_at);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE archive (
 | 
				
			||||||
 | 
					    username varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    timestamp BIGINT UNSIGNED NOT NULL,
 | 
				
			||||||
 | 
					    peer varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    bare_peer varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    xml mediumtext NOT NULL,
 | 
				
			||||||
 | 
					    txt mediumtext,
 | 
				
			||||||
 | 
					    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
 | 
				
			||||||
 | 
					    kind varchar(10),
 | 
				
			||||||
 | 
					    nick varchar(191),
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE FULLTEXT INDEX i_text ON archive(txt);
 | 
				
			||||||
 | 
					CREATE INDEX i_username_timestamp USING BTREE ON archive(username(191), timestamp);
 | 
				
			||||||
 | 
					CREATE INDEX i_username_peer USING BTREE ON archive(username(191), peer(191));
 | 
				
			||||||
 | 
					CREATE INDEX i_username_bare_peer USING BTREE ON archive(username(191), bare_peer(191));
 | 
				
			||||||
 | 
					CREATE INDEX i_timestamp USING BTREE ON archive(timestamp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE archive_prefs (
 | 
				
			||||||
 | 
					    username varchar(191) NOT NULL PRIMARY KEY,
 | 
				
			||||||
 | 
					    def text NOT NULL,
 | 
				
			||||||
 | 
					    always text NOT NULL,
 | 
				
			||||||
 | 
					    never text NOT NULL,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE vcard (
 | 
				
			||||||
 | 
					    username varchar(191) PRIMARY KEY,
 | 
				
			||||||
 | 
					    vcard mediumtext NOT NULL,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE vcard_search (
 | 
				
			||||||
 | 
					    username varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    lusername varchar(191) PRIMARY KEY,
 | 
				
			||||||
 | 
					    fn text NOT NULL,
 | 
				
			||||||
 | 
					    lfn varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    family text NOT NULL,
 | 
				
			||||||
 | 
					    lfamily varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    given text NOT NULL,
 | 
				
			||||||
 | 
					    lgiven varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    middle text NOT NULL,
 | 
				
			||||||
 | 
					    lmiddle varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    nickname text NOT NULL,
 | 
				
			||||||
 | 
					    lnickname varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    bday text NOT NULL,
 | 
				
			||||||
 | 
					    lbday varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    ctry text NOT NULL,
 | 
				
			||||||
 | 
					    lctry varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    locality text NOT NULL,
 | 
				
			||||||
 | 
					    llocality varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    email text NOT NULL,
 | 
				
			||||||
 | 
					    lemail varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    orgname text NOT NULL,
 | 
				
			||||||
 | 
					    lorgname varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    orgunit text NOT NULL,
 | 
				
			||||||
 | 
					    lorgunit varchar(191) NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE INDEX i_vcard_search_lfn       ON vcard_search(lfn);
 | 
				
			||||||
 | 
					CREATE INDEX i_vcard_search_lfamily   ON vcard_search(lfamily);
 | 
				
			||||||
 | 
					CREATE INDEX i_vcard_search_lgiven    ON vcard_search(lgiven);
 | 
				
			||||||
 | 
					CREATE INDEX i_vcard_search_lmiddle   ON vcard_search(lmiddle);
 | 
				
			||||||
 | 
					CREATE INDEX i_vcard_search_lnickname ON vcard_search(lnickname);
 | 
				
			||||||
 | 
					CREATE INDEX i_vcard_search_lbday     ON vcard_search(lbday);
 | 
				
			||||||
 | 
					CREATE INDEX i_vcard_search_lctry     ON vcard_search(lctry);
 | 
				
			||||||
 | 
					CREATE INDEX i_vcard_search_llocality ON vcard_search(llocality);
 | 
				
			||||||
 | 
					CREATE INDEX i_vcard_search_lemail    ON vcard_search(lemail);
 | 
				
			||||||
 | 
					CREATE INDEX i_vcard_search_lorgname  ON vcard_search(lorgname);
 | 
				
			||||||
 | 
					CREATE INDEX i_vcard_search_lorgunit  ON vcard_search(lorgunit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE privacy_default_list (
 | 
				
			||||||
 | 
					    username varchar(191) PRIMARY KEY,
 | 
				
			||||||
 | 
					    name varchar(191) NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE privacy_list (
 | 
				
			||||||
 | 
					    username varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    name varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_privacy_list_username_name USING BTREE ON privacy_list (username(75), name(75));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE privacy_list_data (
 | 
				
			||||||
 | 
					    id bigint,
 | 
				
			||||||
 | 
					    t character(1) NOT NULL,
 | 
				
			||||||
 | 
					    value text NOT NULL,
 | 
				
			||||||
 | 
					    action character(1) NOT NULL,
 | 
				
			||||||
 | 
					    ord NUMERIC NOT NULL,
 | 
				
			||||||
 | 
					    match_all boolean NOT NULL,
 | 
				
			||||||
 | 
					    match_iq boolean NOT NULL,
 | 
				
			||||||
 | 
					    match_message boolean NOT NULL,
 | 
				
			||||||
 | 
					    match_presence_in boolean NOT NULL,
 | 
				
			||||||
 | 
					    match_presence_out boolean NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE INDEX i_privacy_list_data_id ON privacy_list_data(id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE private_storage (
 | 
				
			||||||
 | 
					    username varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    namespace varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    data text NOT NULL,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_private_storage_username_namespace USING BTREE ON private_storage(username(75), namespace(75));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- Not tested in mysql
 | 
				
			||||||
 | 
					CREATE TABLE roster_version (
 | 
				
			||||||
 | 
					    username varchar(191) PRIMARY KEY,
 | 
				
			||||||
 | 
					    version text NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- To update from 1.x:
 | 
				
			||||||
 | 
					-- ALTER TABLE rosterusers ADD COLUMN askmessage text AFTER ask;
 | 
				
			||||||
 | 
					-- UPDATE rosterusers SET askmessage = '';
 | 
				
			||||||
 | 
					-- ALTER TABLE rosterusers ALTER COLUMN askmessage SET NOT NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE pubsub_node (
 | 
				
			||||||
 | 
					  host text NOT NULL,
 | 
				
			||||||
 | 
					  node text NOT NULL,
 | 
				
			||||||
 | 
					  parent VARCHAR(191) NOT NULL DEFAULT '',
 | 
				
			||||||
 | 
					  plugin text NOT NULL,
 | 
				
			||||||
 | 
					  nodeid bigint auto_increment primary key
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					CREATE INDEX i_pubsub_node_parent ON pubsub_node(parent(120));
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_pubsub_node_tuple ON pubsub_node(host(71), node(120));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE pubsub_node_option (
 | 
				
			||||||
 | 
					  nodeid bigint,
 | 
				
			||||||
 | 
					  name text NOT NULL,
 | 
				
			||||||
 | 
					  val text NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					CREATE INDEX i_pubsub_node_option_nodeid ON pubsub_node_option(nodeid);
 | 
				
			||||||
 | 
					ALTER TABLE `pubsub_node_option` ADD FOREIGN KEY (`nodeid`) REFERENCES `pubsub_node` (`nodeid`) ON DELETE CASCADE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE pubsub_node_owner (
 | 
				
			||||||
 | 
					  nodeid bigint,
 | 
				
			||||||
 | 
					  owner text NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					CREATE INDEX i_pubsub_node_owner_nodeid ON pubsub_node_owner(nodeid);
 | 
				
			||||||
 | 
					ALTER TABLE `pubsub_node_owner` ADD FOREIGN KEY (`nodeid`) REFERENCES `pubsub_node` (`nodeid`) ON DELETE CASCADE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE pubsub_state (
 | 
				
			||||||
 | 
					  nodeid bigint,
 | 
				
			||||||
 | 
					  jid text NOT NULL,
 | 
				
			||||||
 | 
					  affiliation character(1),
 | 
				
			||||||
 | 
					  subscriptions VARCHAR(191) NOT NULL DEFAULT '',
 | 
				
			||||||
 | 
					  stateid bigint auto_increment primary key
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					CREATE INDEX i_pubsub_state_jid ON pubsub_state(jid(60));
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_pubsub_state_tuple ON pubsub_state(nodeid, jid(60));
 | 
				
			||||||
 | 
					ALTER TABLE `pubsub_state` ADD FOREIGN KEY (`nodeid`) REFERENCES `pubsub_node` (`nodeid`) ON DELETE CASCADE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE pubsub_item (
 | 
				
			||||||
 | 
					  nodeid bigint,
 | 
				
			||||||
 | 
					  itemid text NOT NULL,
 | 
				
			||||||
 | 
					  publisher text NOT NULL,
 | 
				
			||||||
 | 
					  creation varchar(32) NOT NULL,
 | 
				
			||||||
 | 
					  modification varchar(32) NOT NULL,
 | 
				
			||||||
 | 
					  payload mediumtext NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					CREATE INDEX i_pubsub_item_itemid ON pubsub_item(itemid(36));
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_pubsub_item_tuple ON pubsub_item(nodeid, itemid(36));
 | 
				
			||||||
 | 
					ALTER TABLE `pubsub_item` ADD FOREIGN KEY (`nodeid`) REFERENCES `pubsub_node` (`nodeid`) ON DELETE CASCADE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE pubsub_subscription_opt (
 | 
				
			||||||
 | 
					  subid text NOT NULL,
 | 
				
			||||||
 | 
					  opt_name varchar(32),
 | 
				
			||||||
 | 
					  opt_value text NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_pubsub_subscription_opt ON pubsub_subscription_opt(subid(32), opt_name(32));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE muc_room (
 | 
				
			||||||
 | 
					    name text NOT NULL,
 | 
				
			||||||
 | 
					    host text NOT NULL,
 | 
				
			||||||
 | 
					    opts mediumtext NOT NULL,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_muc_room_name_host USING BTREE ON muc_room(name(75), host(75));
 | 
				
			||||||
 | 
					CREATE INDEX i_muc_room_host_created_at ON muc_room(host(75), created_at);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE muc_registered (
 | 
				
			||||||
 | 
					    jid text NOT NULL,
 | 
				
			||||||
 | 
					    host text NOT NULL,
 | 
				
			||||||
 | 
					    nick text NOT NULL,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE INDEX i_muc_registered_nick USING BTREE ON muc_registered(nick(75));
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_muc_registered_jid_host USING BTREE ON muc_registered(jid(75), host(75));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE muc_online_room (
 | 
				
			||||||
 | 
					    name text NOT NULL,
 | 
				
			||||||
 | 
					    host text NOT NULL,
 | 
				
			||||||
 | 
					    node text NOT NULL,
 | 
				
			||||||
 | 
					    pid text NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_muc_online_room_name_host USING BTREE ON muc_online_room(name(75), host(75));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE muc_online_users (
 | 
				
			||||||
 | 
					    username text NOT NULL,
 | 
				
			||||||
 | 
					    server text NOT NULL,
 | 
				
			||||||
 | 
					    resource text NOT NULL,
 | 
				
			||||||
 | 
					    name text NOT NULL,
 | 
				
			||||||
 | 
					    host text NOT NULL,
 | 
				
			||||||
 | 
					    node text NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_muc_online_users USING BTREE ON muc_online_users(username(75), server(75), resource(75), name(75), host(75));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE muc_room_subscribers (
 | 
				
			||||||
 | 
					   room varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					   host varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					   jid varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					   nick text NOT NULL,
 | 
				
			||||||
 | 
					   nodes text NOT NULL,
 | 
				
			||||||
 | 
					   created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 | 
				
			||||||
 | 
					  UNIQUE KEY i_muc_room_subscribers_host_room_jid (host, room, jid)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE INDEX i_muc_room_subscribers_host_jid USING BTREE ON muc_room_subscribers(host, jid);
 | 
				
			||||||
 | 
					CREATE INDEX i_muc_room_subscribers_jid USING BTREE ON muc_room_subscribers(jid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE motd (
 | 
				
			||||||
 | 
					    username varchar(191) PRIMARY KEY,
 | 
				
			||||||
 | 
					    xml text,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE caps_features (
 | 
				
			||||||
 | 
					    node varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    subnode varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    feature text,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE INDEX i_caps_features_node_subnode ON caps_features(node(75), subnode(75));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE sm (
 | 
				
			||||||
 | 
					    usec bigint NOT NULL,
 | 
				
			||||||
 | 
					    pid text NOT NULL,
 | 
				
			||||||
 | 
					    node text NOT NULL,
 | 
				
			||||||
 | 
					    username varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    resource varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    priority text NOT NULL,
 | 
				
			||||||
 | 
					    info text NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_sid ON sm(usec, pid(75));
 | 
				
			||||||
 | 
					CREATE INDEX i_node ON sm(node(75));
 | 
				
			||||||
 | 
					CREATE INDEX i_username ON sm(username);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE oauth_token (
 | 
				
			||||||
 | 
					    token varchar(191) NOT NULL PRIMARY KEY,
 | 
				
			||||||
 | 
					    jid text NOT NULL,
 | 
				
			||||||
 | 
					    scope text NOT NULL,
 | 
				
			||||||
 | 
					    expire bigint NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE oauth_client (
 | 
				
			||||||
 | 
					    client_id varchar(191) NOT NULL PRIMARY KEY,
 | 
				
			||||||
 | 
					    client_name text NOT NULL,
 | 
				
			||||||
 | 
					    grant_type text NOT NULL,
 | 
				
			||||||
 | 
					    options text NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE route (
 | 
				
			||||||
 | 
					    domain text NOT NULL,
 | 
				
			||||||
 | 
					    server_host text NOT NULL,
 | 
				
			||||||
 | 
					    node text NOT NULL,
 | 
				
			||||||
 | 
					    pid text NOT NULL,
 | 
				
			||||||
 | 
					    local_hint text NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_route ON route(domain(75), server_host(75), node(75), pid(75));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE bosh (
 | 
				
			||||||
 | 
					    sid text NOT NULL,
 | 
				
			||||||
 | 
					    node text NOT NULL,
 | 
				
			||||||
 | 
					    pid text NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_bosh_sid ON bosh(sid(75));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE proxy65 (
 | 
				
			||||||
 | 
					    sid text NOT NULL,
 | 
				
			||||||
 | 
					    pid_t text NOT NULL,
 | 
				
			||||||
 | 
					    pid_i text NOT NULL,
 | 
				
			||||||
 | 
					    node_t text NOT NULL,
 | 
				
			||||||
 | 
					    node_i text NOT NULL,
 | 
				
			||||||
 | 
					    jid_i text NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_proxy65_sid ON proxy65 (sid(191));
 | 
				
			||||||
 | 
					CREATE INDEX i_proxy65_jid ON proxy65 (jid_i(191));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE push_session (
 | 
				
			||||||
 | 
					    username text NOT NULL,
 | 
				
			||||||
 | 
					    timestamp bigint NOT NULL,
 | 
				
			||||||
 | 
					    service text NOT NULL,
 | 
				
			||||||
 | 
					    node text NOT NULL,
 | 
				
			||||||
 | 
					    xml text NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_push_usn ON push_session (username(191), service(191), node(191));
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_push_ut ON push_session (username(191), timestamp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE mix_channel (
 | 
				
			||||||
 | 
					    channel text NOT NULL,
 | 
				
			||||||
 | 
					    service text NOT NULL,
 | 
				
			||||||
 | 
					    username text NOT NULL,
 | 
				
			||||||
 | 
					    domain text NOT NULL,
 | 
				
			||||||
 | 
					    jid text NOT NULL,
 | 
				
			||||||
 | 
					    hidden boolean NOT NULL,
 | 
				
			||||||
 | 
					    hmac_key text NOT NULL,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_mix_channel ON mix_channel (channel(191), service(191));
 | 
				
			||||||
 | 
					CREATE INDEX i_mix_channel_serv ON mix_channel (service(191));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE mix_participant (
 | 
				
			||||||
 | 
					    channel text NOT NULL,
 | 
				
			||||||
 | 
					    service text NOT NULL,
 | 
				
			||||||
 | 
					    username text NOT NULL,
 | 
				
			||||||
 | 
					    domain text NOT NULL,
 | 
				
			||||||
 | 
					    jid text NOT NULL,
 | 
				
			||||||
 | 
					    id text NOT NULL,
 | 
				
			||||||
 | 
					    nick text NOT NULL,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_mix_participant ON mix_participant (channel(191), service(191), username(191), domain(191));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE mix_subscription (
 | 
				
			||||||
 | 
					    channel text NOT NULL,
 | 
				
			||||||
 | 
					    service text NOT NULL,
 | 
				
			||||||
 | 
					    username text NOT NULL,
 | 
				
			||||||
 | 
					    domain text NOT NULL,
 | 
				
			||||||
 | 
					    node text NOT NULL,
 | 
				
			||||||
 | 
					    jid text NOT NULL
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_mix_subscription ON mix_subscription (channel(153), service(153), username(153), domain(153), node(153));
 | 
				
			||||||
 | 
					CREATE INDEX i_mix_subscription_chan_serv_node ON mix_subscription (channel(191), service(191), node(191));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE mix_pam (
 | 
				
			||||||
 | 
					    username text NOT NULL,
 | 
				
			||||||
 | 
					    channel text NOT NULL,
 | 
				
			||||||
 | 
					    service text NOT NULL,
 | 
				
			||||||
 | 
					    id text NOT NULL,
 | 
				
			||||||
 | 
					    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE UNIQUE INDEX i_mix_pam ON mix_pam (username(191), channel(191), service(191));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE mqtt_pub (
 | 
				
			||||||
 | 
					    username varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    resource varchar(191) NOT NULL,
 | 
				
			||||||
 | 
					    topic text NOT NULL,
 | 
				
			||||||
 | 
					    qos tinyint NOT NULL,
 | 
				
			||||||
 | 
					    payload blob NOT NULL,
 | 
				
			||||||
 | 
					    payload_format tinyint NOT NULL,
 | 
				
			||||||
 | 
					    content_type text NOT NULL,
 | 
				
			||||||
 | 
					    response_topic text NOT NULL,
 | 
				
			||||||
 | 
					    correlation_data blob NOT NULL,
 | 
				
			||||||
 | 
					    user_properties blob NOT NULL,
 | 
				
			||||||
 | 
					    expiry int unsigned NOT NULL,
 | 
				
			||||||
 | 
					    UNIQUE KEY i_mqtt_topic (topic(191))
 | 
				
			||||||
 | 
					) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" | mariadb -D $sqldb
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "Generating dhfile..."
 | 
				
			||||||
 | 
					openssl dhparam -out /etc/ssl/dh2048.pem 2048
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "HTTP uploads in XMPP are stored on the server itself. There are many
 | 
				
			||||||
 | 
					different parameters you can configure with respect to HTTP uploads. A soft
 | 
				
			||||||
 | 
					quota can be set per user, along with a hard quota. After the hard quota is
 | 
				
			||||||
 | 
					exceeded, files are deleted from the oldest until the total size of files the
 | 
				
			||||||
 | 
					user has on the server is less than the soft quota."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					read -p "What soft quota would you like to set per user? (MB): " softquota
 | 
				
			||||||
 | 
					while read -p "$softquota MB is this correct? (y/n): " confirm; do
 | 
				
			||||||
 | 
					    if [ "$confirm" == "y" ]; then
 | 
				
			||||||
 | 
					        break
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        read -p "What soft quota would you like to set per user? (MB): " softquota
 | 
				
			||||||
 | 
					        continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					read -p "What hard quota would you like to set per user? (MB): " hardquota
 | 
				
			||||||
 | 
					while read -p "$hardquota MB is this correct? (y/n): " confirm; do
 | 
				
			||||||
 | 
					    if [ "$confirm" == "y" ]; then
 | 
				
			||||||
 | 
					        break
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        read -p "What hard quota would you like to set per user? (MB): " hardquota
 | 
				
			||||||
 | 
					        continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "Installing ejabberd config file..."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo """
 | 
				
			||||||
 | 
					###
 | 
				
			||||||
 | 
					###              ejabberd configuration file
 | 
				
			||||||
 | 
					###
 | 
				
			||||||
 | 
					### The parameters used in this configuration file are explained at
 | 
				
			||||||
 | 
					###
 | 
				
			||||||
 | 
					###       https://docs.ejabberd.im/admin/configuration
 | 
				
			||||||
 | 
					###
 | 
				
			||||||
 | 
					### The configuration file is written in YAML.
 | 
				
			||||||
 | 
					### *******************************************************
 | 
				
			||||||
 | 
					### *******           !!! WARNING !!!               *******
 | 
				
			||||||
 | 
					### *******     YAML IS INDENTATION SENSITIVE       *******
 | 
				
			||||||
 | 
					### ******* MAKE SURE YOU INDENT SECTIONS CORRECTLY *******
 | 
				
			||||||
 | 
					### *******************************************************
 | 
				
			||||||
 | 
					### Refer to http://en.wikipedia.org/wiki/YAML for the brief description.
 | 
				
			||||||
 | 
					###
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# strict TLS configuration to disable insecure ciphers and TLS versions
 | 
				
			||||||
 | 
					define_macro:
 | 
				
			||||||
 | 
					  BACKLOG: 50
 | 
				
			||||||
 | 
					  DH_FILE: /etc/ssl/dh2048.pem
 | 
				
			||||||
 | 
					  CIPHERS: \"ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256\"
 | 
				
			||||||
 | 
					  TLS_OPTIONS:
 | 
				
			||||||
 | 
					    - \"no_sslv2\"
 | 
				
			||||||
 | 
					    - \"no_sslv3\"
 | 
				
			||||||
 | 
					    - \"no_tlsv1\"
 | 
				
			||||||
 | 
					    - \"no_tlsv1_1\"
 | 
				
			||||||
 | 
					    - \"cipher_server_preference\"
 | 
				
			||||||
 | 
					    - \"no_compression\"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hosts:
 | 
				
			||||||
 | 
					  - $domain
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loglevel: info
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					acme:
 | 
				
			||||||
 | 
					  auto: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					certfiles:
 | 
				
			||||||
 | 
					  - ${domains[0]}
 | 
				
			||||||
 | 
					  - ${domains[1]}
 | 
				
			||||||
 | 
					  - ${domains[2]}
 | 
				
			||||||
 | 
					  - ${domains[3]}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					c2s_ciphers: TLS_CIPHERS
 | 
				
			||||||
 | 
					c2s_protocol_options: TLS_OPTIONS
 | 
				
			||||||
 | 
					c2s_dhfile: DH_FILE
 | 
				
			||||||
 | 
					s2s_ciphers: TLS_CIPHERS
 | 
				
			||||||
 | 
					s2s_protocol_options: TLS_OPTIONS
 | 
				
			||||||
 | 
					s2s_dhfile: DH_FILE
 | 
				
			||||||
 | 
					s2s_use_starttls: required
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					listen:
 | 
				
			||||||
 | 
					  -
 | 
				
			||||||
 | 
					    port: 5222
 | 
				
			||||||
 | 
					    ip: \"::\"
 | 
				
			||||||
 | 
					    module: ejabberd_c2s
 | 
				
			||||||
 | 
					    max_stanza_size: 262144    
 | 
				
			||||||
 | 
					    starttls: true
 | 
				
			||||||
 | 
					    starttls_required: false
 | 
				
			||||||
 | 
					    tls_compression: false
 | 
				
			||||||
 | 
					    shaper: c2s_shaper
 | 
				
			||||||
 | 
					    access: c2s
 | 
				
			||||||
 | 
					    backlog: BACKLOG
 | 
				
			||||||
 | 
					  -
 | 
				
			||||||
 | 
					    port: 5223
 | 
				
			||||||
 | 
					    ip: \"::\"
 | 
				
			||||||
 | 
					    tls: true
 | 
				
			||||||
 | 
					    backlog: BACKLOG
 | 
				
			||||||
 | 
					    module: ejabberd_c2s
 | 
				
			||||||
 | 
					    max_stanza_size: 262144
 | 
				
			||||||
 | 
					    shaper: c2s_shaper
 | 
				
			||||||
 | 
					    access: c2s
 | 
				
			||||||
 | 
					    tls_compression: false
 | 
				
			||||||
 | 
					  -
 | 
				
			||||||
 | 
					    port: 5269
 | 
				
			||||||
 | 
					    ip: \"::\"
 | 
				
			||||||
 | 
					    module: ejabberd_s2s_in
 | 
				
			||||||
 | 
					    max_stanza_size: 524288
 | 
				
			||||||
 | 
					    tls_compression: false
 | 
				
			||||||
 | 
					  -
 | 
				
			||||||
 | 
					    port: 5270
 | 
				
			||||||
 | 
					    ip: \"::\"
 | 
				
			||||||
 | 
					    backlog: BACKLOG
 | 
				
			||||||
 | 
					    module: ejabberd_s2s_in
 | 
				
			||||||
 | 
					    max_stanza_size: 524288
 | 
				
			||||||
 | 
					    tls_compression: false
 | 
				
			||||||
 | 
					  -
 | 
				
			||||||
 | 
					    port: 5280
 | 
				
			||||||
 | 
					    ip: \"::\"
 | 
				
			||||||
 | 
					    module: ejabberd_http
 | 
				
			||||||
 | 
					    request_handlers:
 | 
				
			||||||
 | 
					      /admin: ejabberd_web_admin
 | 
				
			||||||
 | 
					      /.well-known/acme-challenge: ejabberd_acme
 | 
				
			||||||
 | 
					      /upload: mod_http_upload
 | 
				
			||||||
 | 
					  -
 | 
				
			||||||
 | 
					    port: 3478
 | 
				
			||||||
 | 
					    ip: \"::\"
 | 
				
			||||||
 | 
					    transport: udp
 | 
				
			||||||
 | 
					    module: ejabberd_stun
 | 
				
			||||||
 | 
					    use_turn: true
 | 
				
			||||||
 | 
					  -
 | 
				
			||||||
 | 
					    port: 1883
 | 
				
			||||||
 | 
					    ip: \"::\"
 | 
				
			||||||
 | 
					    module: mod_mqtt
 | 
				
			||||||
 | 
					    backlog: 1000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					auth_method: sql
 | 
				
			||||||
 | 
					default_db: sql
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sql_type: mysql
 | 
				
			||||||
 | 
					sql_server: \"localhost\"
 | 
				
			||||||
 | 
					sql_database: \"$sqldb\"
 | 
				
			||||||
 | 
					sql_username: \"$sqlusername\"
 | 
				
			||||||
 | 
					sql_password: \"$sqlpassword\"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					acl:
 | 
				
			||||||
 | 
					  admin:
 | 
				
			||||||
 | 
					    user: $adminusername@$domain
 | 
				
			||||||
 | 
					  local:
 | 
				
			||||||
 | 
					    user_regexp: \"\"
 | 
				
			||||||
 | 
					  loopback:
 | 
				
			||||||
 | 
					    ip:
 | 
				
			||||||
 | 
					      - 127.0.0.0/8
 | 
				
			||||||
 | 
					      - ::1/128
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					access_rules:
 | 
				
			||||||
 | 
					  configure:
 | 
				
			||||||
 | 
					    allow: admin # only allow an admin to configure the server
 | 
				
			||||||
 | 
					  local:
 | 
				
			||||||
 | 
					    allow: local
 | 
				
			||||||
 | 
					  c2s:
 | 
				
			||||||
 | 
					    allow: all
 | 
				
			||||||
 | 
					    deny: blocked
 | 
				
			||||||
 | 
					  announce:
 | 
				
			||||||
 | 
					    allow: admin # only allow an admin to send announcements
 | 
				
			||||||
 | 
					  muc_create:
 | 
				
			||||||
 | 
					    allow: admin # only allow an admin to create MUCs
 | 
				
			||||||
 | 
					  pubsub_createnode:
 | 
				
			||||||
 | 
					    allow: local
 | 
				
			||||||
 | 
					  trusted_network:
 | 
				
			||||||
 | 
					    allow: loopback
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					api_permissions:
 | 
				
			||||||
 | 
					  \"console commands\":
 | 
				
			||||||
 | 
					    from:
 | 
				
			||||||
 | 
					      - ejabberd_ctl
 | 
				
			||||||
 | 
					    who: all
 | 
				
			||||||
 | 
					    what: \"*\"
 | 
				
			||||||
 | 
					  \"admin access\":
 | 
				
			||||||
 | 
					    who:
 | 
				
			||||||
 | 
					      access:
 | 
				
			||||||
 | 
					        allow:
 | 
				
			||||||
 | 
					          - acl: loopback
 | 
				
			||||||
 | 
					          - acl: admin
 | 
				
			||||||
 | 
					      oauth:
 | 
				
			||||||
 | 
					        scope: \"ejabberd:admin\"
 | 
				
			||||||
 | 
					        access:
 | 
				
			||||||
 | 
					          allow:
 | 
				
			||||||
 | 
					            - acl: loopback
 | 
				
			||||||
 | 
					            - acl: admin
 | 
				
			||||||
 | 
					    what:
 | 
				
			||||||
 | 
					      - \"*\"
 | 
				
			||||||
 | 
					      - \"!stop\"
 | 
				
			||||||
 | 
					      - \"!start\"
 | 
				
			||||||
 | 
					  \"public commands\":
 | 
				
			||||||
 | 
					    who:
 | 
				
			||||||
 | 
					      ip: 127.0.0.1/8
 | 
				
			||||||
 | 
					    what:
 | 
				
			||||||
 | 
					      - status
 | 
				
			||||||
 | 
					      - connected_users_number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					shaper:
 | 
				
			||||||
 | 
					  normal:
 | 
				
			||||||
 | 
					  rate: 1000000 # monal (iOS XMPP client) only has 30 seconds to load messages (of which there could be many) from a push notification, hence the high rate
 | 
				
			||||||
 | 
					    burst_size: 5000000 # see above
 | 
				
			||||||
 | 
					  fast: 50000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					shaper_rules:
 | 
				
			||||||
 | 
					  max_user_sessions: 10
 | 
				
			||||||
 | 
					  max_user_offline_messages:
 | 
				
			||||||
 | 
					    5000: admin
 | 
				
			||||||
 | 
					    1000: all
 | 
				
			||||||
 | 
					  c2s_shaper:
 | 
				
			||||||
 | 
					    none: admin
 | 
				
			||||||
 | 
					    normal: all
 | 
				
			||||||
 | 
					  s2s_shaper: fast
 | 
				
			||||||
 | 
					  soft_upload_quota:
 | 
				
			||||||
 | 
					    $softquota: all # MB
 | 
				
			||||||
 | 
					  hard_upload_quota:
 | 
				
			||||||
 | 
					    $hardquota: all # MB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					modules:
 | 
				
			||||||
 | 
					  mod_adhoc: {}
 | 
				
			||||||
 | 
					  mod_admin_extra: {}
 | 
				
			||||||
 | 
					  mod_announce:
 | 
				
			||||||
 | 
					    access: announce
 | 
				
			||||||
 | 
					  mod_avatar: {}
 | 
				
			||||||
 | 
					  mod_blocking: {}
 | 
				
			||||||
 | 
					  mod_bosh: {}
 | 
				
			||||||
 | 
					  mod_caps: {}
 | 
				
			||||||
 | 
					  mod_carboncopy: {}
 | 
				
			||||||
 | 
					  mod_client_state: {}
 | 
				
			||||||
 | 
					  mod_configure: {}
 | 
				
			||||||
 | 
					  mod_disco: {}
 | 
				
			||||||
 | 
					  mod_fail2ban: {}
 | 
				
			||||||
 | 
					  mod_http_api: {}
 | 
				
			||||||
 | 
					  mod_http_upload:
 | 
				
			||||||
 | 
					    put_url: \"https://${domains[3]}/upload/@HOST@\"
 | 
				
			||||||
 | 
					    hosts:
 | 
				
			||||||
 | 
					      - ${domains[3]}
 | 
				
			||||||
 | 
					    custom_headers:
 | 
				
			||||||
 | 
					      \"Access-Control-Allow-Origin\": \"*\"
 | 
				
			||||||
 | 
					      \"Access-Control-Allow-Methods\": \"GET,HEAD,PUT,OPTIONS\"
 | 
				
			||||||
 | 
					      \"Access-Control-Allow-Headers\": \"Content-Type\"
 | 
				
			||||||
 | 
					  #mod_http_upload_quota:
 | 
				
			||||||
 | 
					    #max_days: 100 # 100 days until content is deleted
 | 
				
			||||||
 | 
					  mod_last: {}
 | 
				
			||||||
 | 
					  mod_mam:
 | 
				
			||||||
 | 
					    ## Mnesia is limited to 2GB, better to use an SQL backend
 | 
				
			||||||
 | 
					    ## For small servers SQLite is a good fit and is very easy
 | 
				
			||||||
 | 
					    ## to configure. Uncomment this when you have SQL configured:
 | 
				
			||||||
 | 
					    db_type: sql
 | 
				
			||||||
 | 
					    assume_mam_usage: true
 | 
				
			||||||
 | 
					    default: always
 | 
				
			||||||
 | 
					  mod_mqtt: {}
 | 
				
			||||||
 | 
					  mod_muc:
 | 
				
			||||||
 | 
					    access:
 | 
				
			||||||
 | 
					      - allow
 | 
				
			||||||
 | 
					    access_admin:
 | 
				
			||||||
 | 
					      - allow: admin
 | 
				
			||||||
 | 
					    access_create: muc_create
 | 
				
			||||||
 | 
					    access_persistent: muc_create
 | 
				
			||||||
 | 
					    access_mam:
 | 
				
			||||||
 | 
					      - allow
 | 
				
			||||||
 | 
					    default_room_options:
 | 
				
			||||||
 | 
					      mam: true
 | 
				
			||||||
 | 
					  mod_muc_admin: {}
 | 
				
			||||||
 | 
					  mod_offline:
 | 
				
			||||||
 | 
					    access_max_user_messages: max_user_offline_messages
 | 
				
			||||||
 | 
					  mod_ping: {}
 | 
				
			||||||
 | 
					  mod_privacy: {}
 | 
				
			||||||
 | 
					  mod_private: {}
 | 
				
			||||||
 | 
					  mod_proxy65:
 | 
				
			||||||
 | 
					    access: local
 | 
				
			||||||
 | 
					    max_connections: 5
 | 
				
			||||||
 | 
					  mod_pubsub:
 | 
				
			||||||
 | 
					    access_createnode: pubsub_createnode
 | 
				
			||||||
 | 
					    plugins:
 | 
				
			||||||
 | 
					      - flat
 | 
				
			||||||
 | 
					      - pep
 | 
				
			||||||
 | 
					    force_node_config:
 | 
				
			||||||
 | 
					      ## Avoid buggy clients to make their bookmarks public
 | 
				
			||||||
 | 
					      \"eu.siacs.conversations.axolotl.*\":
 | 
				
			||||||
 | 
					        access_model: open
 | 
				
			||||||
 | 
					      storage:bookmarks:
 | 
				
			||||||
 | 
					        access_model: whitelist
 | 
				
			||||||
 | 
					  mod_push: {}
 | 
				
			||||||
 | 
					  mod_push_keepalive: {}
 | 
				
			||||||
 | 
					  mod_register:
 | 
				
			||||||
 | 
					    ## Only accept registration requests from the \"trusted\"
 | 
				
			||||||
 | 
					    ## network (see access_rules section above).
 | 
				
			||||||
 | 
					    ## Think twice before enabling registration from any
 | 
				
			||||||
 | 
					    ## address. See the Jabber SPAM Manifesto for details:
 | 
				
			||||||
 | 
					    ## https://github.com/ge0rg/jabber-spam-fighting-manifesto
 | 
				
			||||||
 | 
					    ip_access: trusted_network
 | 
				
			||||||
 | 
					  mod_roster:
 | 
				
			||||||
 | 
					    versioning: true
 | 
				
			||||||
 | 
					  mod_s2s_dialback: {}
 | 
				
			||||||
 | 
					  mod_shared_roster: {}
 | 
				
			||||||
 | 
					  mod_stream_mgmt:
 | 
				
			||||||
 | 
					    resend_on_timeout: if_offline
 | 
				
			||||||
 | 
					  mod_stun_disco: {}
 | 
				
			||||||
 | 
					  mod_vcard: {}
 | 
				
			||||||
 | 
					  mod_vcard_xupdate: {}
 | 
				
			||||||
 | 
					  mod_version:
 | 
				
			||||||
 | 
					    show_os: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Local Variables:
 | 
				
			||||||
 | 
					### mode: yaml
 | 
				
			||||||
 | 
					### End:
 | 
				
			||||||
 | 
					### vim: set filetype=yaml tabstop=8""" > /etc/ejabberd/ejabberd.yml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					chmod 700 /etc/ejabberd/ejabberd.yml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "Installing nginx upload vhost file..."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "
 | 
				
			||||||
 | 
					server {
 | 
				
			||||||
 | 
					    server_name ${domains[3]};
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					    listen 443 ssl; 
 | 
				
			||||||
 | 
					    ssl_certificate ${certdirs[4]}/fullchain.pem;
 | 
				
			||||||
 | 
					    ssl_certificate_key ${certdirs[4]}/privkey.pem; 
 | 
				
			||||||
 | 
					    include /etc/letsencrypt/options-ssl-nginx.conf; 
 | 
				
			||||||
 | 
					    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    location /upload {
 | 
				
			||||||
 | 
						   proxy_pass http://localhost:5280/upload;
 | 
				
			||||||
 | 
						   proxy_set_header Host \$host;
 | 
				
			||||||
 | 
						   proxy_set_header X-Real-IP \$remote_addr;
 | 
				
			||||||
 | 
						   proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
 | 
				
			||||||
 | 
						   proxy_set_header X-Forwarded-Proto \$scheme;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					server {
 | 
				
			||||||
 | 
					    if ($host = ${domains[3]}) {
 | 
				
			||||||
 | 
					        return 301 https://$host$request_uri;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    server_name ${domains[3]};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    listen 80;
 | 
				
			||||||
 | 
					    return 404;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}" > /etc/nginx/sites-available/${domains[3]} # direct uploads to ejabberd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ln -s /etc/nginx/sites-available/${domains[3]} /etc/nginx/sites-enabled/${domains[3]}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					systemctl restart nginx
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user