網頁

2021年11月25日 星期四

Ubuntu 中文輸入

Xavier
$ sudo apt install ibus-chewing

System Settings/Language Support
按 Install / Remove Langeages...
點選 Chinese (traditional)
按 Apply

$ sudo reboot

System Settings/Text Entry
按 + 選 Chinese (chewing)(IBus)

$ sudo reboot

auto mount nfs after boot

$ sudo vi /etc/fstab
ip:/folder /media/folder        auto    noauto,x-systemd.automount 0 0

Install JetPack 4.6

參考 https://yingrenn.blogspot.com/2020/05/install-jetpack-44.html

$ sudo apt update
$ sudo dpkg -i sdkmanager_1.6.1-8175_amd64.deb
(Reading database ... 346387 files and directories currently installed.)
Preparing to unpack sdkmanager_1.6.1-8175_amd64.deb ...
Unpacking sdkmanager (1.6.1-8175) over (1.6.1-8175) ...
dpkg: dependency problems prevent configuration of sdkmanager:
 sdkmanager depends on libgconf-2-4; however:
  Package libgconf-2-4 is not installed.
 sdkmanager depends on libcanberra-gtk-module; however:
  Package libcanberra-gtk-module is not installed.

dpkg: error processing package sdkmanager (--install):
 dependency problems - leaving unconfigured
Processing triggers for gnome-menus (3.13.3-11ubuntu1.1) ...
Processing triggers for desktop-file-utils (0.23-1ubuntu3.18.04.2) ...
Processing triggers for mime-support (3.60ubuntu1) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...
Errors were encountered while processing:
 sdkmanager

出錯,使用下列命令
$ sudo apt --fix-broken install

$ sdkmanager

2021年11月23日 星期二

nginx, tomcat and mariadb on QNAP

[/share/Dockers/mariadb] # cat 0_run.sh
docker run --detach --name mariadb \
--env MARIADB_ROOT_PASSWORD=mark1234 \
-v /share/Dockers/mariadb/test:/test \
-v /share/Dockers/mariadb/conf.d:/etc/mysql/conf.d \
mariadb:latest

/share/Dockers/mariadb/test 可放置一些 create database sql

[/share/Dockers/mariadb] # cat conf.d/char.cnf
[client]
# Default is Latin1, if you need UTF-8 set this (also in server section)
default-character-set = utf8mb4

[mysql]
# Default is Latin1, if you need UTF-8 set this (also in server section)
default-character-set = utf8mb4

[/share/Dockers/mariadb] # cat cs_get.sh
CONTAINER_ID=$(docker ps -qf "name=mariadb")
echo ${CONTAINER_ID}
CONTAINER_ID=$(cd /var/lib/docker/containers && ls -d ${CONTAINER_ID}*)
echo ${CONTAINER_ID}
QIP=127.0.0.1
QPORT=8080
curl -sq -XPOST -c cookies.txt -d '{"username": "admin", "password": "password"}' http://${QIP}:${QPORT}/container-station/api/v1/login
curl -sq -XGET -b cookies.txt http://${QIP}:${QPORT}/container-station/api/v1/container/docker/${CONTAINER_ID}/all

[/share/Dockers/mariadb] # cat cs_set.sh
CONTAINER_ID=$(docker ps -qf "name=mariadb")
echo ${CONTAINER_ID}
CONTAINER_ID=$(cd /var/lib/docker/containers && ls -d ${CONTAINER_ID}*)
echo ${CONTAINER_ID}
QIP=127.0.0.1
QPORT=8080
curl -sq -XPOST -c cookies.txt -d '{"username": "admin", "password": "password"}' http://${QIP}:${QPORT}/container-station/api/v1/login
curl -sq -XPUT -b cookies.txt http://${QIP}:${QPORT}/container-station/api/v1/container/docker/${CONTAINER_ID}/autostart/on
curl -sq -XPOST -b cookies.txt -d \
    '{
        "cputime": 500,
        "memory": "1024m"
    }' http://${QIP}:${QPORT}/container-station/api/v1/container/docker/${CONTAINER_ID}/resource/limit

因為此版本已經不建議使用 manager-gui
直接利用 webapps
[/share/Dockers/tomcat] # ls
0_run.sh*  build_docker/  cookies.txt  cs_set.sh*  webapps/
aa.sh*     conf/          cs_get.sh*   test.war
[/share/Dockers/tomcat] # cat 0_run.sh
rm -rf webapps/*
cp test.war webapps

docker run -d \
--link mariadb:mariadb \
-p 8888:8080 \
-v /share/Dockers/tomcat/webapps:/usr/local/tomcat/webapps \
-v /share/Dockers/tomcat/conf/context.xml:/usr/local/tomcat/conf/context.xml \
-v /share/Dockers/tomcat/conf/server.xml:/usr/local/tomcat/conf/server.xml \
--name tomcat tomcat:9.0.46

新增 Resource 部分
[/share/Dockers/tomcat] # cat conf/context.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
...
<Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
    <Resource
        name="jdbc/MyDb"
        auth="Container"
        type="javax.sql.DataSource"
        maxActive="100"
        maxIdle="30"
        maxWait="500"
        driverClassName="org.mariadb.jdbc.Driver"
        url="jdbc:mariadb://mariadb:3306"
        username="mast"
        password="mast"
    />
</Context>

新增 maxDays 防止 log 太大
[/share/Dockers/tomcat] # cat conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
...
        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               rotatable="true" renameOnRotate="true" maxDays="3"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>
    </Engine>
  </Service>
</Server>


[/share/Dockers/tomcat] # cat cs_get.sh
CONTAINER_ID=$(docker ps -qf "name=tomcat")
echo ${CONTAINER_ID}
CONTAINER_ID=$(cd /var/lib/docker/containers && ls -d ${CONTAINER_ID}*)
echo ${CONTAINER_ID}
QIP=127.0.0.1
QPORT=8080
curl -sq -XPOST -c cookies.txt -d '{"username": "admin", "password": "password"}' http://${QIP}:${QPORT}/container-station/api/v1/login
curl -sq -XGET -b cookies.txt http://${QIP}:${QPORT}/container-station/api/v1/container/docker/${CONTAINER_ID}/all

[/share/Dockers/tomcat] # cat cs_set.sh
CONTAINER_ID=$(docker ps -qf "name=tomcat")
echo ${CONTAINER_ID}
CONTAINER_ID=$(cd /var/lib/docker/containers && ls -d ${CONTAINER_ID}*)
echo ${CONTAINER_ID}
QIP=127.0.0.1
QPORT=8080
curl -sq -XPOST -c cookies.txt -d '{"username": "admin", "password": "password"}' http://${QIP}:${QPORT}/container-station/api/v1/login
curl -sq -XPUT -b cookies.txt http://${QIP}:${QPORT}/container-station/api/v1/container/docker/${CONTAINER_ID}/autostart/on
curl -sq -XPOST -b cookies.txt -d \
    '{
        "cputime": 500,
        "memory": "1024m"
    }' http://${QIP}:${QPORT}/container-station/api/v1/container/docker/${CONTAINER_ID}/resource/limit

[/share/Dockers/nginx] # cat 0_run.sh
docker run -d \
--link tomcat:tomcat \
-p 8443:80 \
-v /share/Dockers/nginx/conf.d:/etc/nginx/conf.d \
-v /share/Dockers/nginx/conf:/etc/nginx/conf \
--name nginx nginx:1.14

[/share/Dockers/nginx] # ls conf
Certs/

[/share/Dockers/nginx] # cat conf.d/default.conf
upstream tomcat_server {
    server tomcat:8080 weight=1;
}
server {
    #listen       80;
    listen       80 ssl;
    ssl_certificate /etc/nginx/conf/Certs/server.pem;
    ssl_certificate_key /etc/nginx/conf/Certs/server.key;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/nginx/conf/Certs/caChain.crt;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    #server_name  localhost;
    server_name  www.sunhousetechnology.com.tw;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        #proxy_pass http://tomcat_server;
    }
    location ^~ /test/ {
        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;
        # for https
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://tomcat_server;
    }
    client_max_body_size 20M;

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

[/share/Dockers/nginx] # cat cs_get.sh
CONTAINER_ID=$(docker ps -qf "name=nginx")
echo ${CONTAINER_ID}
CONTAINER_ID=$(cd /var/lib/docker/containers && ls -d ${CONTAINER_ID}*)
echo ${CONTAINER_ID}
QIP=127.0.0.1
QPORT=8080
curl -sq -XPOST -c cookies.txt -d '{"username": "admin", "password": "password"}' http://${QIP}:${QPORT}/container-station/api/v1/login
curl -sq -XGET -b cookies.txt http://${QIP}:${QPORT}/container-station/api/v1/container/docker/${CONTAINER_ID}/all

[/share/Dockers/nginx] # cat cs_set.sh
CONTAINER_ID=$(docker ps -qf "name=nginx")
echo ${CONTAINER_ID}
CONTAINER_ID=$(cd /var/lib/docker/containers && ls -d ${CONTAINER_ID}*)
echo ${CONTAINER_ID}
QIP=127.0.0.1
QPORT=8080
curl -sq -XPOST -c cookies.txt -d '{"username": "admin", "password": "password"}' http://${QIP}:${QPORT}/container-station/api/v1/login
curl -sq -XPUT -b cookies.txt http://${QIP}:${QPORT}/container-station/api/v1/container/docker/${CONTAINER_ID}/autostart/on
curl -sq -XPOST -b cookies.txt -d \
    '{
        "cputime": 500,
        "memory": "1024m"
    }' http://${QIP}:${QPORT}/container-station/api/v1/container/docker/${CONTAINER_ID}/resource/limit


2021年11月22日 星期一

gitea on QNAP (設定 Auto Start, CPU Memory 限制)

參考: http://qnap-dev.github.io/container-station-api/index.html
因為使用 QNAP 的 container station api, 不能使用 QNAP 的 2-step verification

[/share/Dockers/gitea] # cat 0_run.sh
#mkdir -p data/git
#mkdir -p data/gitea

docker run -d --name=gitea \
-p 10022:22 -p 3000:3000 \
-v /share/Dockers/gitea/data/gitea:/data/gitea \
-v /share/Dockers/gitea/data/git:/data/git \
gitea/gitea:latest

[/share/Dockers/gitea] # cat cs_get.sh
CONTAINER_ID=$(docker ps -qf "name=gitea")
echo ${CONTAINER_ID}
CONTAINER_ID=$(cd /var/lib/docker/containers && ls -d ${CONTAINER_ID}*)
echo ${CONTAINER_ID}
QIP=127.0.0.1
QPORT=8080
curl -sq -XPOST -c cookies.txt -d '{"username": "admin", "password": "password"}' http://${QIP}:${QPORT}/container-station/api/v1/login
curl -sq -XGET -b cookies.txt http://${QIP}:${QPORT}/container-station/api/v1/container/docker/${CONTAINER_ID}/all

[/share/Dockers/gitea] # cat cs_set.sh
CONTAINER_ID=$(docker ps -qf "name=gitea")
echo ${CONTAINER_ID}
CONTAINER_ID=$(cd /var/lib/docker/containers && ls -d ${CONTAINER_ID}*)
echo ${CONTAINER_ID}
QIP=127.0.0.1
QPORT=8080
curl -sq -XPOST -c cookies.txt -d '{"username": "admin", "password": "password"}' http://${QIP}:${QPORT}/container-station/api/v1/login
curl -sq -XPUT -b cookies.txt http://${QIP}:${QPORT}/container-station/api/v1/container/docker/${CONTAINER_ID}/autostart/on
curl -sq -XPOST -b cookies.txt -d \
    '{
        "cputime": 500,
        "memory": "1024m"
    }' http://${QIP}:${QPORT}/container-station/api/v1/container/docker/${CONTAINER_ID}/resource/limit

2021年11月17日 星期三

frps on QNAP

使用 ssh 登入 QNAP
# mkdir -p /share/Dockers/frp/
# vi /share/Dockers/frp/frps.ini
bind_port = 7000
dashboard_port = 7001
dashboard_user = user
dashboard_pwd = password

# curl -L https://github.com/fatedier/frp/releases/download/v0.31.2/frp_0.31.2_linux_amd64.tar.gz --output frp.tar.gz
# gzip -d frp.tar.gz
# tar frp.tar
# vi /share/Dockers/frp/Dockerfile
FROM ubuntu:18.04
MAINTAINER mark

COPY frp_0.31.2_linux_amd64/ /home/frp

ENTRYPOINT ["/bin/sh","-c","/home/frp/frps -c /home/frp/frps.ini"]

# vi /share/Dockers/frp/0_build.sh
docker build -t frps_0.31.2 . --no-cache

# vi /share/Dockers/frp/1_run.sh
#!/bin/bash
F_NAME=1_run_.sh
>$F_NAME
echo "docker run -d \\">>$F_NAME
echo "-p 7000:7000 -p 7001:7001 \\">>$F_NAME
while read line; do
  echo $line
  port=($(echo $line | tr ':' "\n"))
  echo "-p $port:$port \\">>$F_NAME
done < nat.txt
echo "--name frps frps_0.31.2:latest">>$F_NAME
chmod +x $F_NAME
./$F_NAME

# vi /share/Dockers/frp/nat.txt
7002:host 1
7003:host 2

# chmod +x /share/Dockers/frp/0_build.sh
# chmod +x /share/Dockers/frp/1_run.sh
# ./0_build.sh
# ./1_run.sh

QNAP/Container Station/Container
按 frps 連結
按 Settings
設定 Auto start, CPU Limit, Memory Limit

QNAP/Container Station/Images
刪除 frps_0.31.2:latest, 因為上個動作已經產生 frps_0.31.2:latest-data-1

gitea on QNAP

開啟 QNAP ssh
QNAP/Control Panel/Network & File Services/Telnet / SSH
Allow SSH connection
Apply

建立 docker 使用空間
QNAP/Control Panel/Privilege/Shared Folders
Create/Shared Folder
Folder Name: Dockers
Next/Next/Finish

建立 Gitea Docker
使用 ssh 登入 QNAP
Console Management - Main menu
>> q
>> y
# cd /share/Dockers
# mkdir -p /share/Dockers/gitea
# docker pull gitea/gitea:latest
# docker run -d --name=gitea -p 10022:22 -p 3000:3000 -v /share/Dockers/gitea:/data gitea/gitea:latest

設定 Gitea 帳號
網頁登入 http://qnap_ip:3000/
底部/管理員帳戶設定
輸入 管理員帳號 密碼 電子信箱
安裝 Gitea

進入 Gitea 建立 Repository
網頁登入 http://qnap_ip:3000/
右上/+/新增儲存庫
輸入 儲存庫名稱
建立儲存庫

由 Git 匯入 Gitea
進入 git host 的目錄
> git remote add gitea http://qnap_ip:3000/UserName/Repository.git
> git push gitea --all
Username for 'http://qnap_ip:3000':
Password for 'http://UserName@qnap_ip:3000':
> git push gitea --tags
Username for 'http://qnap_ip:3000':
Password for 'http://UserName@qnap_ip:3000':

Gitea 備份 兩種方法可選
(1.進入 docker)
QNAP/Container Station/Container
按 gitea 連結,開啟 console logs
按 >_ Terminal
/bin/sh
Connect
# su - git
$ gitea dump -c /data/gitea/conf/app.ini
產生 /data/git/gitea-dump-xxxxx.zip
位於 QNAP 的 /share/Dockers/gitea/git
(2.進入 QNAP)
使用 ssh 登入 QNAP
# docker exec -u git -it -w /data/git $(docker ps -qf "name=gitea") bash -c '/app/gitea/gitea dump -c /data/gitea/conf/app.ini'
產生 /share/Dockers/gitea/git/gitea-dump-xxxxx.zip
位於 docker 的 /data/git

Gitea 還原
QNAP/Container Station/Container
按 gitea 連結,開啟 console logs
按 Stop
使用 ssh 登入 QNAP
# mkdir -p /share/Dockers/backup
# mv /share/Dockers/gitea/git/gitea-dump-xxxxx.zip /share/Dockers/backup
# cd /share/Dockers/backup
# unzip gitea-dump-xxxxx.zip
# ls /share/Dockers/backup/data/
avatars/  gitea.db   jwt/     repo-archive/
conf/     indexers/  queues/  repo-avatars/
# ls /share/Dockers/gitea/gitea/
attachments/  conf/     indexers/  log/     repo-archive/  sessions/
avatars/      gitea.db  jwt/       queues/  repo-avatars/
移除 /share/Dockers/gitea/gitea/ 內相應 /share/Dockers/backup/data/ 的資料
# mv /share/Dockers/backup/data/* /share/Dockers/gitea/gitea/
# chown -R owner.group /share/Dockers/gitea/gitea/
# rm -rf /share/Dockers/gitea/git/repositories/*
# mv /share/Dockers/backup/repos/* /share/Dockers/gitea/git/repositories/
# chown -R owner.group /share/Dockers/gitea/git/repositories/
Gitea 文件上說明,還要搬 log, database
但 log 不見了, database 使用 sqlite3, 直接是一檔案, 搬 data/gitea.db 後不須重建
QNAP/Container Station/Container
按 gitea 連結,開啟 console logs
按 Start
# rm -rf /share/Dockers/backup

Gitea Migrations 遷移
在 Gitea 1.12 以前,可以遷移 程式碼 問題 等
但在之後,無法遷移程式碼
遷移預設無法在本地端執行,需在 /data/gitea/conf/app.ini
增加下列兩行
[migrations]
ALLOW_LOCALNETWORKS = true
要遷移 Wiki 里程碑 標籤 等,需要 Access Token
網頁登入 http://qnap_ip:3000/
右上/圖標/設定/應用程式
輸入 Token 名稱
產生 Token
網頁登入 http://qnap_ip:3000/
右上/+/遷移外部儲存庫