Commit 383638d9 authored by Jeffery's avatar Jeffery

Signed-off-by: Jeffery <shuochen.tw@ecom.com.tw>

parents
# server
#! /bin/bash
# Program:
# Create empty file to record Let's Encrypt Certification.
# Histroy:
# 2019/08/23 First release
touch acme.json
chmod 600 acme.json
\ No newline at end of file
version: '2'
services:
flask:
build: flask/.
ports:
- "80:80"
- "8000:8000"
- "8888:8888"
environment:
- MSSQL_HOST=61.221.240.69
- MSSQL_PORT=1433
- MSSQL_USR=sa
- MSSQL_PWD=ecom2828
- MSSQL_DB=typark
- MSSQL_TDS=8.0
- MYSQL_HOST=10.0.0.2
- MYSQL_PORT=3306
- MYSQL_USR=root
- MYSQL_PWD=Jeffery2019
- MYSQL_DB=
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "flask_data:/notebooks"
networks:
net:
ipv4_address: 192.168.0.100
restart: always
container_name: flask
mosquitto:
image: eclipse-mosquitto
ports:
- "1883:1883"
- "9001:9001"
networks:
net:
ipv4_address: 192.168.0.101
restart: always
container_name: mosquitto
srs:
build: srs/.
ports:
- "1935:1935"
networks:
net:
ipv4_address: 192.168.0.102
restart: always
container_name: srs
easydarwin:
build: easydarwin/.
ports:
- "554:554"
networks:
net:
ipv4_address: 192.168.0.103
restart: always
container_name: easydarwin
volumes:
flask_data:
networks:
net:
external:
name: server_net
\ No newline at end of file
FROM ubuntu:18.04
RUN apt update
RUN apt install -y wget tar
RUN wget https://github.com/EasyDarwin/EasyDarwin/releases/download/v8.1.0/EasyDarwin-linux-8.1.0-1901141151.tar.gz
RUN tar zxvf EasyDarwin-linux-8.1.0-1901141151.tar.gz
WORKDIR EasyDarwin-linux-8.1.0-1901141151
CMD ./easydarwin
# ffmpeg.exe -re -i 2.mp4 -rtsp_transport tcp -vcodec h264 -f rtsp rtsp://192.168.5.201:554/live.sdp
# ffmpeg -rtsp_transport tcp -i rtsp://ncut0:ecom2828@192.168.5.198/main_0 -c:v copy -c:a copy -rtsp_transport tcp -f rtsp rtsp://192.168.5.201:554/live
\ No newline at end of file
FROM raspbian/jessie
# 更新套件清單
RUN apt update
# 安裝 systemctl
RUN apt install -y systemd
# 安裝 nginx & python3
RUN apt install -y nginx python3-dev python3-pip python3-matplotlib python3-scipy
# 安裝 mssql
RUN apt install -y tdsodbc freetds-dev unixodbc unixodbc-dev
# 移除套件清單
RUN rm -rf /var/lib/apt/lists/*
# 更新 python3 套件清單
RUN pip3 install --upgrade pip
# 安裝 flask 套件
RUN pip3 install Flask-API flask flask-restful flask-cors flask-jwt-extended flask-sqlalchemy flask-mysql
# 安裝 jupyter & uwsgi & docker 套件
RUN pip3 install jupyter uwsgi docker
# 安裝其他套件
RUN pip3 install passlib pytz pypyodbc requests
# 設定 Flask 編碼與時區
ENV LC_ALL=C.UTF-8 LANG=C.UTF-8 TZ=Asia/Taipei
# 設定 Flask Debug 模式參數
ENV FLASK_APP=run.py FLASK_DEBUG=1
# 複製設定檔
COPY setting/default /etc/nginx/sites-available/default # nginx 設定
COPY setting/freetds.conf /etc/freetds/freetds.conf # mssql 設定
COPY setting/odbc.ini /etc/odbc.ini #
COPY setting/odbcinst.ini /etc/odbcinst.ini #
# 複製基礎程式碼
COPY notebooks /notebooks
# 設定工作執行目錄
WORKDIR /notebooks
# 啟動伺服器
CMD service nginx start & uwsgi --ini /notebooks/uwsgi.ini
\ No newline at end of file
FROM ubuntu:18.04
# 更新套件清單
RUN apt update
# 安裝 systemctl
RUN apt install -y systemd
# 安裝 nginx
RUN apt install -y nginx
# 修改 nginx 設定
RUN echo "server {" > /etc/nginx/sites-available/default
RUN echo " listen 80;" >> /etc/nginx/sites-available/default
RUN echo " server_name localhost;" >> /etc/nginx/sites-available/default
RUN echo " charset utf-8;" >> /etc/nginx/sites-available/default
RUN echo " access_log /notebooks/log/nginx_access.log;" >> /etc/nginx/sites-available/default
RUN echo " error_log /notebooks/log/nginx_error.log;" >> /etc/nginx/sites-available/default
RUN echo " location / {" >> /etc/nginx/sites-available/default
RUN echo " include /etc/nginx/uwsgi_params;" >> /etc/nginx/sites-available/default
RUN echo " uwsgi_pass unix:/notebooks/uwsgi.sock;" >> /etc/nginx/sites-available/default
RUN echo " }" >> /etc/nginx/sites-available/default
RUN echo "}" >> /etc/nginx/sites-available/default
# 安裝 mssql
RUN apt install -y tdsodbc freetds-dev unixodbc unixodbc-dev
# 修改 mssql 設定
RUN echo "[sqlserver]" > /etc/freetds/freetds.conf
RUN echo " host = ${MSSQL_HOST}" >> /etc/freetds/freetds.conf
RUN echo " port = ${MSSQL_PORT}" >> /etc/freetds/freetds.conf
RUN echo " tds version = ${TDS_VERSION}" >> /etc/freetds/freetds.conf
RUN echo "[sqlserverdatasource]" > /etc/odbc.ini
RUN echo " Driver = FreeTDS" >> /etc/odbc.ini
RUN echo " Description = ODBC connection via FreeTDS" >> /etc/odbc.ini
RUN echo " Servername = sqlserver" >> /etc/odbc.ini
RUN echo " Database = ${MSSQL_DABS}" >> /etc/odbc.ini
RUN echo " TDS_Version = ${TDS_VERSION}" >> /etc/odbc.ini
RUN echo "[ODBC]" > /etc/odbcinst.ini
RUN echo " Trace = Yes" >> /etc/odbcinst.ini
RUN echo " TraceFile = /notebooks/log/odbc.log" >> /etc/odbcinst.ini
RUN echo "[FreeTDS]" >> /etc/odbcinst.ini
RUN echo " Description = TDS driver (Sybase/MS SQL)" >> /etc/odbcinst.ini
RUN echo " Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so" >> /etc/odbcinst.ini
RUN echo " Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so" >> /etc/odbcinst.ini
RUN echo " CPTimeout =" >> /etc/odbcinst.ini
RUN echo " CPReuse =" >> /etc/odbcinst.ini
RUN echo " FileUsage = 1" >> /etc/odbcinst.ini
# 安裝 python
RUN apt install -y python3-dev python3-pip
# 移除套件清單
RUN rm -rf /var/lib/apt/lists/*
# 更新 python3 套件清單
RUN pip3 install --upgrade pip
RUN pip3 install Flask-API
# 安裝 flask
RUN pip3 install flask flask-restful flask-cors flask-jwt-extended flask-sqlalchemy flask-mysql
# 安裝其他套件
RUN pip3 install passlib pytz pypyodbc requests
# 安裝 jupyter
RUN pip3 install jupyter
# 安裝 uwsgi
RUN pip3 install uwsgi
# MSSQL 相關參數
# ENV MSSQL_HOST MSSQL_PORT MSSQL_USR MSSQL_PWD MSSQL_DB MSSQL_TDS
# MYSQL 相關參數
# ENV MYSQL_HOST MYSQL_PORT MYSQL_USR MYSQL_PWD MYSQL_DB
ENV LC_ALL=C.UTF-8 LANG=C.UTF-8 TZ=Asia/Taipei
ENV FLASK_APP=run.py FLASK_DEBUG=1
# VOLUME ["/notebooks"]
COPY notebooks /notebooks
WORKDIR /notebooks
CMD service nginx start & uwsgi --ini /notebooks/uwsgi.ini
\ No newline at end of file
import pypyodbc as odbc # MS SQL Server
import os as __os, logger as __log
__drive = "DRIVER={FreeTDS};"
__server = "SERVER=" + __os.environ['MSSQL_HOST'] + "," + __os.environ['MSSQL_PORT'] + ";"
__database = "DATABASE=" + __os.environ['MSSQL_DB'] + ';'
__uid = "UID=" + __os.environ['MSSQL_USR'] + ";"
__pwd = "PWD=" + __os.environ['MSSQL_PWD'] + ";"
__version = "TDS_Version=" + __os.environ['MSSQL_TDS'] + ";"
def select(table, columns="*"): # (資料表, 資料欄位)
if isinstance(columns, list): # 查詢特定多個欄位
for column in columns:
fields = (fields + ", " if 'fields' in vars() else "") + column
else: # 查詢特定或所有欄位
fields = columns
# 從資料表中選出指定欄位的內容
return "SELECT " + fields + " FROM " + table
def insert(table, data): # (資料表, 新增資料)
for key in data.keys():
fields = (fields + ", " if 'fields' in vars() else "") + key
value = str(data[key])
values = (values + ", " if 'values' in vars() else "") + "'" + value + "'"
# 新增資料列到資料表中
return "INSERT INTO " + table + " (" + fields + ") VALUES (" + values + ")"
def update(table, data):
for key in data.keys():
pair = key + " = '" + str(data[key]) + "'"
pairs = (pairs + ", " if 'pairs' in vars() else "") + pair
# 更新特定欄位的內容 `" + table + "` SET " + data_set
return "UPDATE " + table + " SET " + pairs
def delete(table):
return "DELETE FROM " + table
def where(query, column, logic, value):
condition = column + ' ' + logic + " '" + str(value) + "'"
# 設定查詢或更新符合條件的資料列
return query + " WHERE " + condition
def where_in(query, column, values):
if isinstance(values, list):
for value in values:
_in = (_in + ", " if '_in' in vars() else "") + "'" + value + "'"
else:
_in = "'" + values + "'"
# 設定查詢或更新符合條件的資料列
return query + " WHERE " + column + " IN (" + _in + ")"
def where_between(query, column, start, end):
_between = "'" + str(start) + "' AND '" + str(end) + "'"
return query + " WHERE " + column + " BETWEEN " + _between
def where_like(query, column, like):
return query + " WHERE " + column + " LIKE '" + like + "'"
def where_or(query, column, logic, value):
condition = column + " " + logic + " '" + str(value) + "'"
# 設定查詢或更新符合條件的資料列
return query + " OR " + condition
def where_and(query, column, logic, value):
condition = column + ' ' + logic + " '" + str(value) + "'"
# 設定查詢或更新符合條件的資料列
return query + " AND " + condition
def orderby(query, column, desc=False):
return query + " ORDER BY " + column + " " + ("DESC" if desc else "ASC")
def fetchall(ip, table, query):
connect = odbc.connect(__drive + __server + __database + __uid + __pwd + __version)
cursor = connect.cursor()
try:
cursor.execute(query)
rows = cursor.fetchall()
connect.commit()
except:
connect.rollback()
__log.write(ip, "ERROR", query)
return False
tag = len(rows) if isinstance(row, tuple) else 0
tag = "SELECT " + str(tag) + " data." if "SELECT" in query else tag
tag = "INSERT " + str(tag) + " data." if "INSERT" in query else tag
tag = "UPDATE " + str(tag) + " data." if "UPDATE" in query else tag
tag = "DELETE " + str(tag) + " data." if "DELETE" in query else tag
__log.write(ip, tag, table, query)
cursor.close()
connect.close()
return rows if isinstance(rows, tuple) else True
def fetchone(query):
connect = odbc.connect(__drive + __server + __database + __uid + __pwd + __version)
cursor = connect.cursor()
try:
cursor.execute(query)
row = cursor.fetchone() if "SELECT" in query else True
connect.commit()
except:
connect.rollback()
__log.write(ip, "ERROR", query)
return False
tag = len(row) if isinstance(row, tuple) else 0
tag = "SELECT " + str(tag) + " data." if "SELECT" in query else tag
tag = "INSERT " + str(tag) + " data." if "INSERT" in query else tag
tag = "UPDATE " + str(tag) + " data." if "UPDATE" in query else tag
tag = "DELETE " + str(tag) + " data." if "DELETE" in query else tag
__log.write(ip, tag, table, query)
cursor.close()
connect.close()
return row if isinstance(row, tuple) else True
\ No newline at end of file
from flask import Flask as __flask
from flaskext.mysql import MySQL as __mysql
import os as __os, logger as __log
__app = __flask(__name__)
__app.config['MYSQL_DATABASE_HOST'] = __os.environ['MYSQL_HOST']
__app.config['MYSQL_DATABASE_PORT'] = int(__os.environ['MYSQL_PORT'])
__app.config['MYSQL_DATABASE_USER'] = __os.environ['MYSQL_USR']
__app.config['MYSQL_DATABASE_PASSWORD'] = __os.environ['MYSQL_PWD']
__app.config['MYSQL_DATABASE_DB'] = 'chiayi'
__mysql = __mysql()
__mysql.init_app(__app)
def select(table, columns="*"):
if isinstance(columns, list):
for column in columns:
fields = (fields + ", " if 'fields' in vars() else "") + "`" + column + "`"
else:
fields = "`" + columns + "`"
return "SELECT " + fields + " FROM `" + table + "`"
def insert(table, data):
for key in data.keys():
fields = (fields + ", " if 'fields' in vars() else "") + "`" + key + "`"
value = str(data[key])
values = (values + ", " if 'values' in vars() else "") + "'" + value + "'"
return "INSERT INTO `" + table + "` (" + fields + ") VALUES (" + values + ")"
def update(table, data):
for key in data.keys():
pair = "`" + key + "` = '" + str(data[key]) + "'"
pairs = (pairs + ", " if 'pairs' in vars() else "") + pair
return "UPDATE `" + table + "` SET " + pairs
def delete(table):
return "DELETE FROM `" + table + "`"
def where(query, column, logic, value):
condition = '`' + column + '` ' + logic + " '" + str(value) + "'"
return query + " WHERE " + condition
def where_in(query, column, values):
if isinstance(values, list):
for value in values:
temp = (temp + ", " if 'temp' in vars() else "") + "'" + value + "'"
else:
temp = "'" + values + "'"
return query + " WHERE `" + column + "` IN (" + temp + ")"
def where_between(query, column, start, end):
temp = "'" + str(start) + "' AND '" + str(end) + "'"
return query + " WHERE `" + column + "` BETWEEN " + temp
def where_like(query, column, like):
return query + " WHERE `" + column + "` LIKE '" + like + "'"
def where_or(query, column, logic, value):
condition = '`' + column + '` ' + logic + " '" + str(value) + "'"
return query + " OR " + condition
def where_and(query, column, logic, value):
condition = '`' + column + '` ' + logic + " '" + str(value) + "'"
return query + " AND " + condition
def orderby(query, column, desc=False):
return query + " ORDER BY `" + column + "` " + ("DESC" if desc else "ASC")
def fetchall(ip, table, query):
connect = __mysql.connect()
cursor = connect.cursor()
try:
cursor.execute(query)
rows = cursor.fetchall()
connect.commit()
except:
connect.rollback()
__log.write(ip, "ERROR", query)
return False
tag = str(connect.affected_rows())
tag = "SELECT " + tag + " data" if "SELECT" in query else tag
tag = "INSERT " + tag + " data" if "INSERT" in query else tag
tag = "UPDATE " + tag + " data" if "UPDATE" in query else tag
tag = "DELETE " + tag + " data" if "DELETE" in query else tag
__log.write(ip, tag, table, query)
cursor.close()
connect.close()
return rows if isinstance(rows, tuple) else True
def fetchone(ip, table, query):
connect = __mysql.connect()
cursor = connect.cursor()
try:
cursor.execute(query)
row = cursor.fetchone()
connect.commit()
except:
connect.rollback()
__log.write(ip, "ERROR", query)
return False
tag = str(connect.affected_rows())
tag = "SELECT " + tag + " data" if "SELECT" in query else tag
tag = "INSERT " + tag + " data" if "INSERT" in query else tag
tag = "UPDATE " + tag + " data" if "UPDATE" in query else tag
tag = "DELETE " + tag + " data" if "DELETE" in query else tag
__log.write(ip, tag, table, query)
cursor.close()
connect.close()
return row if isinstance(row, tuple) else True
\ No newline at end of file
import os as __os, datetime as __datetime, pytz as __pytz
import sys as __sys, codecs as __codecs
def write(source, tag, table, message):
now = __datetime.datetime.now(tz=__pytz.timezone('Asia/Taipei'))
now = str(int(now.strftime("%Y%m%d%H%M")) - 191100000000)
date = __os.path.join("log", now[0:3], now[3:5])
# Create log folder if it't exists.
if not __os.path.exists(date):
__os.makedirs(date)
# Record SQL operator per day.
with __codecs.open(__os.path.join(date, now[5:7] + '.log'), "a", "utf-8") as f:
f.write(u"[" + source + "][" + now[7:9] + ":" + now[9:11] + "][" + tag + "][" + table + "]:\n" + message + "\n")
# try:
# __sys.stdout = __codecs.getwriter("utf-8")(__sys.stdout.detach())
# except:
# tag = "ERROR"
print(u"[" + source + "][" + now[7:9] + ":" + now[9:11] + "][" + table + "]:" + tag)
[uwsgi]
module = run:app
http-socket = 0.0.0.0:5000
processes = 5
chdir = /notebooks
socket = /notebooks/uwsgi.sock
logto = /notebooks/log/uwsgi.log
chmod-socket = 006
server {
listen 80;
server_name localhost;
charset utf-8;
access_log /notebooks/log/nginx_access.log;
error_log /notebooks/log/nginx_error.log;
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass unix:/notebooks/uwsgi.sock;
}
}
\ No newline at end of file
[sqlserver]
host = ${MSSQL_HOST}
port = ${MSSQL_PORT}
tds version = ${TDS_VERSION}
\ No newline at end of file
[sqlserverdatasource]
Driver = FreeTDS
Description = ODBC connection via FreeTDS
Servername = sqlserver
Database = ${MSSQL_DABS}
TDS_Version = ${TDS_VERSION}
\ No newline at end of file
[ODBC]
Trace = Yes
TraceFile = /notebooks/log/odbc.log
[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
CPTimeout =
CPReuse =
FileUsage = 1
\ No newline at end of file
FROM ubuntu:18.04
RUN apt update
RUN apt install -y git python-dev gcc
RUN git clone https://github.com/winlinvip/simple-rtmp-server
WORKDIR /simple-rtmp-server/trunk
RUN ./configure
RUN make
COPY origin.conf conf/srs.conf
# COPY edge.conf conf/edge.conf
ENV TZ=Asia/Taipei
CMD ./objs/srs -c conf/srs.conf
\ No newline at end of file
# conf/edge.conf
listen 1935;
max_connections 1000;
pid ./objs/edge.pid;
daemon off;
srs_log_tank ./objs/edge.log;
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
vhost __defaultVhost__ {
cluster {
mode remote;
origin 192.168.5.200;
}
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
}
\ No newline at end of file
# conf/origin.conf
listen 1935;
max_connections 1000;
daemon off;
pid objs/origin.pid;
srs_log_file ./objs/origin.log;
vhost __defaultVhost__ {
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
}
\ No newline at end of file
version: '2'
services:
phpMyAdmin:
image: phpmyadmin/phpmyadmin
ports:
- "8080:80"
environment:
- PMA_HOST=mysql
- PMA_USER=root
- PMA_PASSWORD=xMd2k5aK
links:
- mysql
networks:
net:
ipv4_address: 192.168.0.4
restart: "no"
container_name: phpMyAdmin
mysql:
image: mysql
# ports:
# - "3306:3306" # Access port
environment:
- MYSQL_ROOT_PASSWORD=xMd2k5aK
volumes:
- "mysql_data:/var/lib/mysql"
networks:
net:
ipv4_address: 192.168.0.5
command: --default-authentication-plugin=mysql_native_password
restart: "always"
container_name: mysql
influxdb:
image: influxdb
# ports:
# - "8086:8086" # HTTP API port
# - "8083:8083" # Administrator interface port
# - "8090:8090" # Graphite support
environment:
- INFLUXDB_ADMIN_USER=root
- INFLUXDB_ADMIN_PASSWORD=xMd2k5aK
# - INFLUXDB_ADMIN_ENABLED=true
# - INFLUXDB_GRAPHITE_ENABLED=true
volumes:
- "influxdb_data:/var/lib/influxdb"
networks:
net:
ipv4_address: 192.168.0.6
restart: "always"
container_name: influxdb
volumes:
mysql_data:
influxdb_data:
networks:
net:
external:
name: server_net
\ No newline at end of file
version: '2'
services:
portainer:
image: portainer/portainer
# ports:
# - "9000:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "portainer_data:/data"
networks:
net:
ipv4_address: 192.168.0.2
labels:
- "traefik.docker.network=server_net"
- "traefik.enable=true"
# - "traefik.basic.frontend.rule=Host:portainer.jiantw83.com"
# - "traefik.basic.port=9000"
# - "traefik.basic.protocol=http"
- "traefik.web.frontend.rule=Host:portainer.jiantw83.com"
- "traefik.web.port=9000"
- "traefik.web.protocol=http"
restart: always
container_name: portainer
traefik:
image: traefik
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.toml:/traefik.toml
- ./acme.json:/acme.json
networks:
net:
ipv4_address: 192.168.0.3
restart: always
container_name: traefik
volumes:
portainer_data:
networks:
net:
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.0.0/24
\ No newline at end of file
logLevel = "INFO"
defaultEntryPoints = ["https","http"]
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[retry]
[docker]
endpoint = "unix:///var/run/docker.sock"
watch = true
exposedByDefault = false
[acme]
email = "jiantw83@yahoo.com"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
[acme.httpChallenge]
entryPoint = "http"
[file]
[frontends]
[frontends.pve]
backend = "pve"
[frontends.pve.routes.gui]
rule = "Host:pve.jiantw83.com"
[frontends.nas]
backend = "nas"
[frontends.nas.routes.dsm]
rule = "Host:nas.jiantw83.com"
[frontends.redmine]
backend = "redmine"
[frontends.redmine.routes.gui]
rule = "Host:redmine.jiantw83.com"
[frontends.gitlab]
backend = "gitlab"
[frontends.gitlab.routes.gui]
rule = "Host:gitlab.jiantw83.com"
[backends]
[backends.pve]
[backends.pve.servers.gui]
url = "https://192.168.5.203:8006"
[backends.nas]
[backends.nas.servers.dsm]
url = "http://192.168.5.201:5001"
[backends.redmine]
[backends.redmine.servers.gui]
url = "http://60.249.6.104:30003"
[backends.redmine]
[backends.gitlab.servers.gui]
url = "http://60.249.6.104:30003"
\ No newline at end of file
version: '2'
services:
grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
- "GF_SECURITY_ADMIN_PASSWORD=xMd2k5aK"
networks:
net:
ipv4_address: 192.168.0.200
restart: "always"
container_name: grafana
networks:
net:
external:
name: server_net
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment