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