init - WIP
This commit is contained in:
parent
b1fe1482f2
commit
737482329d
|
@ -0,0 +1,15 @@
|
||||||
|
---
|
||||||
|
osp_git_root: 'https://gitlab.com/Deamos/flask-nginx-rtmp-manager.git'
|
||||||
|
osp_git_commit: '0.7.9'
|
||||||
|
osp_worker_start_port: 5000
|
||||||
|
osp_worker_count: "{{ ansible_processor_nproc }}"
|
||||||
|
|
||||||
|
osp_http_path: "/srv/http"
|
||||||
|
|
||||||
|
osp_db_location: 'sqlite:///db/database.db'
|
||||||
|
osp_secret_key: "{{ lookup('password', 'credentials/'+inventory_hostname+'/osp_secret_key length=8 chars=digits') }}"
|
||||||
|
osp_password_salt: "{{ lookup('password', 'credentials/'+inventory_hostname+'/osp_password_salt length=8 chars=digits') }}"
|
||||||
|
osp_allow_registration: yes
|
||||||
|
osp_require_email_registration: yes
|
||||||
|
osp_ejabberd_domain: "CHANGEME"
|
||||||
|
osp_ejabberd_password: "{{ lookup('password', 'credentials/'+inventory_hostname+'/osp_ejabberd_password length=8 chars=digits') }}"
|
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
- name: restart redis
|
||||||
|
systemd:
|
||||||
|
name: redis
|
||||||
|
state: restarted
|
||||||
|
|
||||||
|
- name: restart ejabberd
|
||||||
|
systemd:
|
||||||
|
name: ejabberd
|
||||||
|
state: restarted
|
||||||
|
|
||||||
|
- name: reload nginx
|
||||||
|
systemd:
|
||||||
|
name: nginx
|
||||||
|
state: reloaded
|
||||||
|
|
||||||
|
- name: restart osp
|
||||||
|
systemd:
|
||||||
|
name: osp.target
|
||||||
|
state: restarted
|
||||||
|
daemon_reload: yes
|
|
@ -0,0 +1,2 @@
|
||||||
|
dependencies:
|
||||||
|
- kewlfft.aur
|
|
@ -0,0 +1,185 @@
|
||||||
|
- name: Workaround ansible switch between users
|
||||||
|
file:
|
||||||
|
path: "/tmp/ansible/"
|
||||||
|
mode: 0777
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
package:
|
||||||
|
name:
|
||||||
|
- redis
|
||||||
|
- ejabberd
|
||||||
|
#- gunicorn
|
||||||
|
#- uwsgi-plugin-python
|
||||||
|
- python-pip
|
||||||
|
- python-virtualenv
|
||||||
|
- ffmpeg #important v4
|
||||||
|
#- python-gevent-websocket
|
||||||
|
- base-devel
|
||||||
|
- yay
|
||||||
|
|
||||||
|
- name: Create AUR User for build
|
||||||
|
user:
|
||||||
|
name: aur_builder
|
||||||
|
|
||||||
|
- name: Add sudo permission to aur user
|
||||||
|
lineinfile:
|
||||||
|
path: /etc/sudoers.d/11-install-aur_builder
|
||||||
|
line: 'aur_builder ALL=(ALL) NOPASSWD: /usr/bin/pacman'
|
||||||
|
create: yes
|
||||||
|
validate: 'visudo -cf %s'
|
||||||
|
|
||||||
|
- name: Install nginx with rtmp
|
||||||
|
become: yes
|
||||||
|
become_user: aur_builder
|
||||||
|
aur:
|
||||||
|
name: nginx-rtmp-sergey-git
|
||||||
|
|
||||||
|
- name: Configure redis
|
||||||
|
notify: restart redis
|
||||||
|
lineinfile:
|
||||||
|
path: /etc/redis.conf
|
||||||
|
regexp: '^appendfsync'
|
||||||
|
line: "appendfsync no"
|
||||||
|
|
||||||
|
- name: Start redis
|
||||||
|
systemd:
|
||||||
|
name: redis
|
||||||
|
state: started
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
- name: Configure ejabberd
|
||||||
|
notify: restart ejabberd
|
||||||
|
template:
|
||||||
|
src: ejabberd.yml
|
||||||
|
dest: /etc/ejabberd/ejabberd.yml
|
||||||
|
|
||||||
|
- name: Start ejabberd
|
||||||
|
systemd:
|
||||||
|
name: ejabberd
|
||||||
|
state: started
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
|
||||||
|
- name: Check if ejabberd account exists
|
||||||
|
become: yes
|
||||||
|
become_user: jabber
|
||||||
|
command: ejabberdctl check_account admin localhost
|
||||||
|
register: jabber_admin
|
||||||
|
changed_when: False
|
||||||
|
failed_when: 'jabber_admin.rc >= 2'
|
||||||
|
|
||||||
|
- name: Register ejabberd Adminuser
|
||||||
|
become: yes
|
||||||
|
become_user: jabber
|
||||||
|
when: jabber_admin.rc == 1
|
||||||
|
command: ejabberdctl register admin localhost "{{ osp_ejabberd_password }}"
|
||||||
|
|
||||||
|
- name: Set password of ejabber admin
|
||||||
|
become: yes
|
||||||
|
become_user: jabber
|
||||||
|
when: jabber_admin.rc == 0
|
||||||
|
command: ejabberdctl change_password admin localhost "{{ osp_ejabberd_password }}"
|
||||||
|
|
||||||
|
- name: Configure NGINX
|
||||||
|
notify: reload nginx
|
||||||
|
template:
|
||||||
|
src: "{{ item }}"
|
||||||
|
dest: "/etc/nginx/{{ item }}"
|
||||||
|
loop:
|
||||||
|
- nginx.conf
|
||||||
|
- osp-rtmp.conf
|
||||||
|
- osp-socketio.conf
|
||||||
|
- osp-redirects.conf
|
||||||
|
|
||||||
|
- name: Create www directory
|
||||||
|
file:
|
||||||
|
path: "{{osp_http_path }}/{{item}}"
|
||||||
|
owner: http
|
||||||
|
group: http
|
||||||
|
state: directory
|
||||||
|
loop:
|
||||||
|
- .
|
||||||
|
- live
|
||||||
|
- videos
|
||||||
|
- live-rec
|
||||||
|
- images
|
||||||
|
- live-adapt
|
||||||
|
- stream-thumb
|
||||||
|
|
||||||
|
- name: Nginx
|
||||||
|
systemd:
|
||||||
|
name: nginx
|
||||||
|
state: started
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
|
||||||
|
- name: Clone OSP repository
|
||||||
|
git:
|
||||||
|
repo: "{{ osp_git_root }}"
|
||||||
|
dest: "/var/lib/osp/"
|
||||||
|
version: "{{ osp_git_commit }}"
|
||||||
|
|
||||||
|
- name: Install python requirements
|
||||||
|
pip:
|
||||||
|
requirements: /var/lib/osp/setup/requirements.txt
|
||||||
|
virtualenv: /opt/osp-venv
|
||||||
|
|
||||||
|
- name: Create cache directory
|
||||||
|
file:
|
||||||
|
path: /var/cache/osp
|
||||||
|
owner: http
|
||||||
|
group: http
|
||||||
|
state: directory
|
||||||
|
|
||||||
|
- name: Create logging directory
|
||||||
|
file:
|
||||||
|
path: /var/log/osp
|
||||||
|
owner: http
|
||||||
|
group: http
|
||||||
|
state: directory
|
||||||
|
|
||||||
|
- name: Configure osp
|
||||||
|
notify: restart osp
|
||||||
|
template:
|
||||||
|
src: "config.py.dist"
|
||||||
|
dest: "/etc/osp.conf"
|
||||||
|
|
||||||
|
- name: Configure supply
|
||||||
|
notify: restart osp
|
||||||
|
file:
|
||||||
|
src: "/etc/osp.conf"
|
||||||
|
dest: "/var/lib/osp/conf/config.py"
|
||||||
|
state: link
|
||||||
|
|
||||||
|
- name: Permissions for database
|
||||||
|
file:
|
||||||
|
path: "/var/lib/osp/{{ item }}"
|
||||||
|
owner: http
|
||||||
|
group: http
|
||||||
|
recurse: yes
|
||||||
|
loop:
|
||||||
|
- db
|
||||||
|
- migrations
|
||||||
|
|
||||||
|
- name: Init Database
|
||||||
|
become: yes
|
||||||
|
become_user: http
|
||||||
|
command: python3 manage.py db init
|
||||||
|
args:
|
||||||
|
chdir: /var/lib/osp/
|
||||||
|
creates: /var/lib/osp/db/database.db
|
||||||
|
|
||||||
|
- name: Install services files and workers
|
||||||
|
notify: restart osp
|
||||||
|
template:
|
||||||
|
src: "{{item}}"
|
||||||
|
dest: "/etc/systemd/system/{{item}}"
|
||||||
|
loop:
|
||||||
|
- osp-worker@.service
|
||||||
|
- osp.target
|
||||||
|
|
||||||
|
- name: Start OSP
|
||||||
|
systemd:
|
||||||
|
name: osp.target
|
||||||
|
state: started
|
||||||
|
enabled: yes
|
|
@ -0,0 +1,29 @@
|
||||||
|
# Set Database Location and Type
|
||||||
|
# For MySQL Connections add ?charset=utf8mb4 for full Unicode Support
|
||||||
|
dbLocation="{{ osp_db_location }}"
|
||||||
|
|
||||||
|
# Redis Configuration
|
||||||
|
redisHost="localhost" # Default localhost
|
||||||
|
redisPort=6379 # Default 6379
|
||||||
|
redisPassword='' # Default ''
|
||||||
|
|
||||||
|
# Flask Secret Key
|
||||||
|
secretKey="{{ osp_secret_key }}"
|
||||||
|
|
||||||
|
# Password Salt Value
|
||||||
|
passwordSalt="{{ osp_password_salt }}"
|
||||||
|
|
||||||
|
# Allow Users to Register with the OSP Server
|
||||||
|
allowRegistration={{ osp_allow_registration }}
|
||||||
|
|
||||||
|
# Require Users to Confirm their Email Addresses
|
||||||
|
requireEmailRegistration={{ osp_require_email_registration }}
|
||||||
|
|
||||||
|
# Enables Debug Mode
|
||||||
|
debugMode = False
|
||||||
|
|
||||||
|
# EJabberD Configuration
|
||||||
|
ejabberdAdmin = "admin"
|
||||||
|
ejabberdPass = "{{ osp_ejabberd_password }}"
|
||||||
|
ejabberdHost = "localhost"
|
||||||
|
#ejabberdServer ="127.0.0.1"
|
|
@ -0,0 +1,268 @@
|
||||||
|
###
|
||||||
|
### 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.
|
||||||
|
###
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
- localhost
|
||||||
|
- {{ osp_ejabberd_domain }}
|
||||||
|
|
||||||
|
loglevel: info
|
||||||
|
|
||||||
|
## If you already have certificates, list them here
|
||||||
|
# certfiles:
|
||||||
|
# - /etc/letsencrypt/live/domain.tld/fullchain.pem
|
||||||
|
# - /etc/letsencrypt/live/domain.tld/privkey.pem
|
||||||
|
|
||||||
|
listen:
|
||||||
|
-
|
||||||
|
port: 5222
|
||||||
|
ip: "::"
|
||||||
|
module: ejabberd_c2s
|
||||||
|
max_stanza_size: 262144
|
||||||
|
shaper: c2s_shaper
|
||||||
|
access: c2s
|
||||||
|
starttls_required: true
|
||||||
|
-
|
||||||
|
port: 5269
|
||||||
|
ip: "::"
|
||||||
|
module: ejabberd_s2s_in
|
||||||
|
max_stanza_size: 524288
|
||||||
|
-
|
||||||
|
port: 5443
|
||||||
|
ip: "::FFFF:127.0.0.1"
|
||||||
|
module: ejabberd_http
|
||||||
|
tls: true
|
||||||
|
request_handlers:
|
||||||
|
/admin: ejabberd_web_admin
|
||||||
|
/api: mod_http_api
|
||||||
|
/bosh: mod_bosh
|
||||||
|
/captcha: ejabberd_captcha
|
||||||
|
/upload: mod_http_upload
|
||||||
|
/ws: ejabberd_http_ws
|
||||||
|
-
|
||||||
|
port: 5280
|
||||||
|
ip: "::FFFF:127.0.0.1"
|
||||||
|
module: ejabberd_http
|
||||||
|
request_handlers:
|
||||||
|
/admin: ejabberd_web_admin
|
||||||
|
/api: mod_http_api
|
||||||
|
/bosh: mod_bosh
|
||||||
|
/captcha: ejabberd_captcha
|
||||||
|
/upload: mod_http_upload
|
||||||
|
/ws: ejabberd_http_ws
|
||||||
|
/.well-known/acme-challenge: ejabberd_acme
|
||||||
|
-
|
||||||
|
port: 3478
|
||||||
|
transport: udp
|
||||||
|
module: ejabberd_stun
|
||||||
|
use_turn: true
|
||||||
|
-
|
||||||
|
port: 1883
|
||||||
|
ip: "::"
|
||||||
|
module: mod_mqtt
|
||||||
|
backlog: 1000
|
||||||
|
-
|
||||||
|
port: 4560
|
||||||
|
ip: "::FFFF:127.0.0.1"
|
||||||
|
module: ejabberd_xmlrpc
|
||||||
|
access_commands:
|
||||||
|
admin:
|
||||||
|
commands: all
|
||||||
|
options: []
|
||||||
|
|
||||||
|
s2s_use_starttls: optional
|
||||||
|
|
||||||
|
acl:
|
||||||
|
local:
|
||||||
|
user_regexp: ""
|
||||||
|
loopback:
|
||||||
|
ip:
|
||||||
|
- 127.0.0.0/8
|
||||||
|
- ::1/128
|
||||||
|
admin:
|
||||||
|
user:
|
||||||
|
- "admin@localhost"
|
||||||
|
|
||||||
|
access_rules:
|
||||||
|
local:
|
||||||
|
allow: local
|
||||||
|
c2s:
|
||||||
|
deny: blocked
|
||||||
|
allow: all
|
||||||
|
announce:
|
||||||
|
allow: admin
|
||||||
|
configure:
|
||||||
|
allow: admin
|
||||||
|
muc_create:
|
||||||
|
allow: local
|
||||||
|
pubsub_createnode:
|
||||||
|
allow: local
|
||||||
|
trusted_network:
|
||||||
|
allow: loopback
|
||||||
|
xmlrpc_access:
|
||||||
|
allow: admin
|
||||||
|
|
||||||
|
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: 3000
|
||||||
|
burst_size: 20000
|
||||||
|
fast: 100000
|
||||||
|
|
||||||
|
shaper_rules:
|
||||||
|
max_user_sessions: 10
|
||||||
|
max_user_offline_messages:
|
||||||
|
5000: admin
|
||||||
|
100: all
|
||||||
|
c2s_shaper:
|
||||||
|
none: admin
|
||||||
|
normal: all
|
||||||
|
s2s_shaper: fast
|
||||||
|
|
||||||
|
auth_use_cache: false
|
||||||
|
auth_password_format: scram
|
||||||
|
extauth_program: "/usr/bin/python3 /var/lib/osp/setup/ejabberd/auth_osp.py"
|
||||||
|
extauth_instances: 3
|
||||||
|
|
||||||
|
host_config:
|
||||||
|
"{{ osp_ejabberd_domain }}":
|
||||||
|
auth_method:
|
||||||
|
- external
|
||||||
|
- anonymous
|
||||||
|
allow_multiple_connections: true
|
||||||
|
anonymous_protocol: login_anon
|
||||||
|
|
||||||
|
|
||||||
|
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://@HOST@:5443/upload
|
||||||
|
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
|
||||||
|
persistent: true
|
||||||
|
max_users: 2500
|
||||||
|
allow_visitor_nickchange: false
|
||||||
|
allow_private_messages_from_visitors: nobody
|
||||||
|
allow_visitor_status: false
|
||||||
|
members_by_default: false
|
||||||
|
max_users: 2500
|
||||||
|
|
||||||
|
mod_muc_admin: {}
|
||||||
|
mod_offline:
|
||||||
|
access_max_user_messages: max_user_offline_messages
|
||||||
|
mod_ping:
|
||||||
|
send_pings: true
|
||||||
|
ping_interval: 60
|
||||||
|
timeout_action: none
|
||||||
|
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
|
||||||
|
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
|
||||||
|
|
||||||
|
allow_contrib_modules: true
|
||||||
|
|
||||||
|
### Local Variables:
|
||||||
|
### mode: yaml
|
||||||
|
### End:
|
||||||
|
### vim: set filetype=yaml tabstop=8
|
|
@ -0,0 +1,145 @@
|
||||||
|
user http;
|
||||||
|
worker_processes auto;
|
||||||
|
|
||||||
|
# pid in nginx.service
|
||||||
|
# pid /run/nginx.pid;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
multi_accept on;
|
||||||
|
use epoll;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
include mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
|
||||||
|
proxy_cache_path /var/cache/osp levels=1:2 keys_zone=auth_cache:5m max_size=1g inactive=24h;
|
||||||
|
|
||||||
|
sendfile on;
|
||||||
|
tcp_nopush on;
|
||||||
|
gzip on;
|
||||||
|
gzip_comp_level 5;
|
||||||
|
gzip_min_length 256;
|
||||||
|
gzip_proxied any;
|
||||||
|
gzip_vary on;
|
||||||
|
|
||||||
|
gzip_types
|
||||||
|
application/atom+xml
|
||||||
|
application/javascript
|
||||||
|
application/json
|
||||||
|
application/ld+json
|
||||||
|
application/manifest+json
|
||||||
|
application/rss+xml
|
||||||
|
application/vnd.geo+json
|
||||||
|
application/vnd.ms-fontobject
|
||||||
|
application/x-font-ttf
|
||||||
|
application/x-web-app-manifest+json
|
||||||
|
application/xhtml+xml
|
||||||
|
application/xml
|
||||||
|
font/opentype
|
||||||
|
image/bmp
|
||||||
|
image/svg+xml
|
||||||
|
image/x-icon
|
||||||
|
image/gif
|
||||||
|
image/png
|
||||||
|
video/mp4
|
||||||
|
video/mpeg
|
||||||
|
video/x-flv
|
||||||
|
text/cache-manifest
|
||||||
|
text/css
|
||||||
|
text/plain
|
||||||
|
text/vcard
|
||||||
|
text/vnd.rim.location.xloc
|
||||||
|
text/vtt
|
||||||
|
text/x-component
|
||||||
|
text/x-cross-domain-policy;
|
||||||
|
|
||||||
|
|
||||||
|
keepalive_timeout 65;
|
||||||
|
|
||||||
|
# Load Balancing for Gunicorn
|
||||||
|
upstream socket_nodes {
|
||||||
|
# sticky only on commercial nginx
|
||||||
|
# sticky cookie srv_id expires=8h;
|
||||||
|
{% for n in range(osp_worker_count) %}
|
||||||
|
server 127.0.0.1:{{ osp_worker_start_port + n }};
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
|
||||||
|
# OSP Edge Streaming Nodes
|
||||||
|
include /var/lib/osp/conf/osp-edge.conf;
|
||||||
|
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 9000;
|
||||||
|
|
||||||
|
allow 127.0.0.1;
|
||||||
|
deny all;
|
||||||
|
|
||||||
|
location /stat {
|
||||||
|
rtmp_stat all;
|
||||||
|
rtmp_stat_stylesheet stat.xsl;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /stat.xsl {
|
||||||
|
root /var/lib/osp/static;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# NGINX to OSP Gunicorn Processes Reverse Proxy
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
|
||||||
|
# set client body size to 16M #
|
||||||
|
client_max_body_size 16M;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://socket_nodes;
|
||||||
|
proxy_redirect off;
|
||||||
|
|
||||||
|
proxy_set_header Host $host:$server_port;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
include osp-socketio.conf;
|
||||||
|
include osp-redirects.conf;
|
||||||
|
|
||||||
|
# redirect server error pages to the static page /50x.html
|
||||||
|
error_page 500 502 503 504 /50x.html;
|
||||||
|
location = /50x.html {
|
||||||
|
root html;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ejabberd Reverse Proxy Config to Allow for ejabberd acme-challenge
|
||||||
|
# Uncomment and change server_name to match
|
||||||
|
#server {
|
||||||
|
# listen 80;
|
||||||
|
# server_name conference.subdomain.domain.tld;
|
||||||
|
# location / {
|
||||||
|
# proxy_pass http://localhost:5280;
|
||||||
|
# }
|
||||||
|
#}
|
||||||
|
# server {
|
||||||
|
# listen 80;
|
||||||
|
# server_name proxy.subdomain.domain.tld;
|
||||||
|
# location / {
|
||||||
|
# proxy_pass http://localhost:5280;
|
||||||
|
# }
|
||||||
|
#}
|
||||||
|
#server {
|
||||||
|
# listen 80;
|
||||||
|
# server_name pubsub.subdomain.domain.tld;
|
||||||
|
# location / {
|
||||||
|
# proxy_pass http://localhost:5280;
|
||||||
|
# }
|
||||||
|
#}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
include osp-rtmp.conf;
|
|
@ -0,0 +1,127 @@
|
||||||
|
location /ospAuth {
|
||||||
|
internal;
|
||||||
|
|
||||||
|
set $channelID "";
|
||||||
|
|
||||||
|
if ($request_uri ~* /videos/(.+)/(.+)) {
|
||||||
|
set $channelID $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request_uri ~* /videos/(.*)/clips/(.*)\.(.+)) {
|
||||||
|
set $channelID $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request_uri ~* /stream-thumb/(.*)\.(.+)) {
|
||||||
|
set $channelID $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request_uri ~* /live-adapt/(.*)\.m3u8) {
|
||||||
|
set $channelID $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request_uri ~* /live-adapt/(.*)_(.*)/(.*)\.(.*)) {
|
||||||
|
set $channelID $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request_uri ~* /live/(.+)/(.+)) {
|
||||||
|
set $channelID $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request_uri ~* /edge/(.+)/(.+)) {
|
||||||
|
set $channelID $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request_uri ~* /edge-adapt/(.*)\.m3u8) {
|
||||||
|
set $channelID $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request_uri ~* /edge-adapt/(.*)_(.*)/(.*)\.(.*)) {
|
||||||
|
set $channelID $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
proxy_pass http://socket_nodes/auth;
|
||||||
|
proxy_pass_request_body off;
|
||||||
|
proxy_set_header Content-Length "";
|
||||||
|
proxy_set_header X-Original-URI $request_uri;
|
||||||
|
proxy_set_header X-Channel-ID $channelID;
|
||||||
|
proxy_cache auth_cache;
|
||||||
|
proxy_cache_key "$cookie_ospSession$http_x_auth_token$channelID";
|
||||||
|
proxy_cache_valid 200 10m;
|
||||||
|
proxy_ignore_headers Set-Cookie;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
location /videos {
|
||||||
|
auth_request /ospAuth;
|
||||||
|
alias {{ osp_http_path }}/videos;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /videos/temp {
|
||||||
|
alias {{ osp_http_path }}/videos/temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /stream-thumb {
|
||||||
|
auth_request /ospAuth;
|
||||||
|
alias {{ osp_http_path }}/stream-thumb;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /live-adapt {
|
||||||
|
auth_request /ospAuth;
|
||||||
|
alias {{ osp_http_path }}/live-adapt;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /live {
|
||||||
|
auth_request /ospAuth;
|
||||||
|
alias {{osp_http_path}}/live;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /static {
|
||||||
|
alias /var/lib/osp/static;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ /images(.*) {
|
||||||
|
# Disable cache
|
||||||
|
add_header Cache-Control no-cache;
|
||||||
|
|
||||||
|
# CORS setup
|
||||||
|
add_header 'Access-Control-Allow-Origin' '*' always;
|
||||||
|
add_header 'Access-Control-Expose-Headers' 'Content-Length';
|
||||||
|
|
||||||
|
# allow CORS preflight requests
|
||||||
|
if ($request_method = 'OPTIONS') {
|
||||||
|
add_header 'Access-Control-Allow-Origin' '*';
|
||||||
|
add_header 'Access-Control-Max-Age' 1728000;
|
||||||
|
add_header 'Content-Type' 'text/plain charset=UTF-8';
|
||||||
|
add_header 'Content-Length' 0;
|
||||||
|
return 204;
|
||||||
|
}
|
||||||
|
|
||||||
|
types {
|
||||||
|
application/vnd.apple.mpegurl m3u8;
|
||||||
|
video/mp2t ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
root {{ osp_http_path }};
|
||||||
|
}
|
||||||
|
|
||||||
|
location /edge {
|
||||||
|
auth_request /ospAuth;
|
||||||
|
rewrite ^/edge/(.*)$ $scheme://$ospedge_node/live/$1 redirect;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /edge-adapt {
|
||||||
|
auth_request /ospAuth;
|
||||||
|
rewrite ^/edge-adapt/(.*)$ $scheme://$ospedge_node/live-adapt/$1 redirect;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /http-bind/ { # BOSH XMPP-HTTP
|
||||||
|
proxy_pass http://localhost:5280/bosh;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Forwarded-For $remote_addr;
|
||||||
|
proxy_redirect off;
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_read_timeout 65s;
|
||||||
|
proxy_send_timeout 65s;
|
||||||
|
keepalive_timeout 65s;
|
||||||
|
tcp_nodelay on;
|
||||||
|
}
|
|
@ -0,0 +1,131 @@
|
||||||
|
rtmp_auto_push on;
|
||||||
|
rtmp_auto_push_reconnect 1s;
|
||||||
|
|
||||||
|
rtmp {
|
||||||
|
server {
|
||||||
|
listen 1935;
|
||||||
|
chunk_size 4096;
|
||||||
|
|
||||||
|
application stream {
|
||||||
|
live on;
|
||||||
|
record off;
|
||||||
|
|
||||||
|
allow publish all;
|
||||||
|
#deny publish all;
|
||||||
|
allow play 127.0.0.1;
|
||||||
|
|
||||||
|
on_publish http://127.0.0.1:5010/auth-key;
|
||||||
|
on_publish_done http://127.0.0.1:5010/deauth-user;
|
||||||
|
|
||||||
|
}
|
||||||
|
application stream-data {
|
||||||
|
live on;
|
||||||
|
|
||||||
|
allow publish all;
|
||||||
|
#deny publish all;
|
||||||
|
allow play 127.0.0.1;
|
||||||
|
|
||||||
|
on_publish http://127.0.0.1:5010/auth-user;
|
||||||
|
push rtmp://127.0.0.1:1935/live/;
|
||||||
|
push rtmp://127.0.0.1:1935/record/;
|
||||||
|
|
||||||
|
hls on;
|
||||||
|
hls_path {{ osp_http_path }}/live;
|
||||||
|
hls_fragment 1;
|
||||||
|
hls_playlist_length 30s;
|
||||||
|
|
||||||
|
hls_nested on;
|
||||||
|
hls_fragment_naming system;
|
||||||
|
|
||||||
|
recorder thumbnail {
|
||||||
|
record video;
|
||||||
|
record_max_frames 600;
|
||||||
|
record_path {{ osp_http_path }}/stream-thumb;
|
||||||
|
record_interval 120s;
|
||||||
|
|
||||||
|
exec_record_done ffmpeg -ss 00:00:01 -i $path -vcodec png -vframes 1 -an -f rawvideo -s 384x216 -y {{ osp_http_path }}/stream-thumb/$name.png;
|
||||||
|
exec_record_done ffmpeg -ss 00:00:00 -t 3 -i $path -filter_complex "[0:v] fps=30,scale=w=384:h=-1,split [a][b];[a] palettegen=stats_mode=single [p];[b][p] paletteuse=new=1" -y {{ osp_http_path }}/stream-thumb/$name.gif;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
application stream-data-adapt {
|
||||||
|
live on;
|
||||||
|
|
||||||
|
allow publish all;
|
||||||
|
#deny publish all;
|
||||||
|
allow play 127.0.0.1;
|
||||||
|
|
||||||
|
on_publish http://127.0.0.1:5010/auth-user;
|
||||||
|
push rtmp://127.0.0.1:1935/live/;
|
||||||
|
push rtmp://127.0.0.1:1935/record/;
|
||||||
|
|
||||||
|
exec ffmpeg -i rtmp://127.0.0.1:1935/live/$name
|
||||||
|
-c:v libx264 -c:a aac -b:a 128k -vf "scale=-2:720" -vsync 1 -copyts -start_at_zero -sws_flags lanczos -r 30 -g 30 -keyint_min 30 -force_key_frames "expr:gte(t,n_forced*1)" -tune zerolatency -preset ultrafast -crf 28 -maxrate 2096k -bufsize 4192k -threads 16 -f flv rtmp://localhost:1935/show/$name_720
|
||||||
|
-c:v libx264 -c:a aac -b:a 96k -vf "scale=-2:480" -vsync 1 -copyts -start_at_zero -sws_flags lanczos -r 30 -g 30 -keyint_min 30 -force_key_frames "expr:gte(t,n_forced*1)" -tune zerolatency -preset ultrafast -crf 28 -maxrate 1200k -bufsize 2400k -threads 16 -f flv rtmp://localhost:1935/show/$name_480
|
||||||
|
-c copy -f flv rtmp://localhost:1935/show/$name_src;
|
||||||
|
|
||||||
|
|
||||||
|
recorder thumbnail {
|
||||||
|
record video;
|
||||||
|
record_max_frames 600;
|
||||||
|
record_path {{ osp_http_path }}/stream-thumb;
|
||||||
|
record_interval 120s;
|
||||||
|
|
||||||
|
exec_record_done ffmpeg -ss 00:00:01 -i $path -vcodec png -vframes 1 -an -f rawvideo -s 384x216 -y {{ osp_http_path }}/stream-thumb/$name.png;
|
||||||
|
exec_record_done ffmpeg -ss 00:00:00 -t 3 -i $path -filter_complex "[0:v] fps=30,scale=w=384:h=-1,split [a][b];[a] palettegen=stats_mode=single [p];[b][p] paletteuse=new=1" -y {{ osp_http_path }}/stream-thumb/$name.gif;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
application show {
|
||||||
|
live on;
|
||||||
|
allow publish 127.0.0.1;
|
||||||
|
allow play 127.0.0.1;
|
||||||
|
|
||||||
|
hls on;
|
||||||
|
hls_path {{ osp_http_path }}/live-adapt;
|
||||||
|
hls_nested on;
|
||||||
|
hls_fragment 1;
|
||||||
|
hls_playlist_length 30s;
|
||||||
|
|
||||||
|
hls_fragment_naming system;
|
||||||
|
|
||||||
|
record off;
|
||||||
|
|
||||||
|
# Instruct clients to adjust resolution according to bandwidth
|
||||||
|
hls_variant _480 BANDWIDTH=1200000; # Medium bitrate, SD resolution
|
||||||
|
hls_variant _720 BANDWIDTH=2048000; # High bitrate, HD 720p resolution
|
||||||
|
hls_variant _src BANDWIDTH=4096000; # Source bitrate, source resolution
|
||||||
|
}
|
||||||
|
|
||||||
|
application record {
|
||||||
|
live on;
|
||||||
|
|
||||||
|
allow publish 127.0.0.1;
|
||||||
|
allow play 127.0.0.1;
|
||||||
|
|
||||||
|
on_publish http://127.0.0.1:5010/auth-record;
|
||||||
|
exec_push mkdir -m 764 {{ osp_http_path }}/videos/$name;
|
||||||
|
|
||||||
|
recorder all {
|
||||||
|
record all;
|
||||||
|
record_path /tmp;
|
||||||
|
record_unique on;
|
||||||
|
record_suffix _%Y%m%d_%H%M%S.flv;
|
||||||
|
exec_record_done bash -c "ffmpeg -y -i $path -codec copy -movflags +faststart {{ osp_http_path }}/videos/$name/$basename.mp4 && rm $path";
|
||||||
|
exec_record_done mv {{ osp_http_path }}/stream-thumb/$name.png {{ osp_http_path }}/videos/$name/$basename.png;
|
||||||
|
exec_record_done mv {{ osp_http_path }}/stream-thumb/$name.gif {{ osp_http_path }}/videos/$name/$basename.gif;
|
||||||
|
on_record_done http://127.0.0.1:5010/deauth-record;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
application live {
|
||||||
|
live on;
|
||||||
|
drop_idle_publisher 30s;
|
||||||
|
allow publish 127.0.0.1;
|
||||||
|
allow play all;
|
||||||
|
|
||||||
|
on_play http://127.0.0.1:5010/playbackAuth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
location /socket.io {
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
|
||||||
|
proxy_set_header X-NginX-Proxy true;
|
||||||
|
|
||||||
|
# prevents 502 bad gateway error
|
||||||
|
proxy_buffers 8 32k;
|
||||||
|
proxy_buffer_size 64k;
|
||||||
|
|
||||||
|
proxy_redirect off;
|
||||||
|
|
||||||
|
# enables WS support
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
|
||||||
|
proxy_pass http://socket_nodes/socket.io;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Gunicorn instance to serve OSP Workers on port %i
|
||||||
|
After=network.target
|
||||||
|
PartOf=osp.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=http
|
||||||
|
Group=http
|
||||||
|
WorkingDirectory=/var/lib/osp
|
||||||
|
Environment="VIRTUAL_ENV=/opt/osp-venv"
|
||||||
|
Environment="PATH=/opt/osp-venv/bin:/usr/local/bin:/usr/bin:/bin"
|
||||||
|
ExecStart=/opt/osp-venv/bin/gunicorn app:app -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 --bind 0.0.0.0:%i --reload --access-logfile /var/log/osp/access.log --error-logfile /var/log/osp/error.log
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
|
@ -0,0 +1,6 @@
|
||||||
|
[Unit]
|
||||||
|
Description = OSP Service
|
||||||
|
Requires = {% for n in range(osp_worker_count) %} osp-worker@{{ osp_worker_start_port + n }}.service{% endfor %}
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy = multi-user.target
|
Loading…
Reference in New Issue