談談傳統的FTP系統,使用docker安裝舊規格ftp server

ftp server很老了, 這個系統傳統上使用tcp port 20(資料傳輸),21(命令) , 稱為active mode(主動模式), 後來進化多了“被動模式”就不再限於20,21, 而且加上tls加密功能就更穩固了.

可是我要談的不是這個, 要談的是有些用了2,30年的工具機,例如cnc加工機, 內建ftp client功能, 而且還是停留在傳統的主動模式,
但隨著服務器作業系統的升級, 有可能讓cnc這種工具機無法相容使用, 因此必須要考慮新作業系統裡面, 加裝傳統的ftp系統,

解法很簡單就是裝個docker ftp server,

安裝如下:

1. 建立使用者空間與使用者帳密資料庫
docker volume create --name ftp-user-db
docker volume create --name ftp-user-file

2. 啟動ftp server
docker run -d --restart always --name ftpd_server -p 21:21 -p 30000-30009:30000-30009 -e "PUBLICHOST=localhost" -v ftp-user-db:/etc/pure-ftpd/passwd -v ftp-user-file:/home/ftpusers stilliard/pure-ftpd

3. 新增使用者
docker exec -it ftpd_server /bin/bash
pure-pw useradd <帳號> -f /etc/pure-ftpd/passwd/pureftpd.passwd -m -u ftpuser -d /home/ftpusers/<帳號>

4. 防火牆
firewall-cmd --add-port=20/tcp --permanent
firewall-cmd --add-port=21/tcp --permanent
firewall-cmd --reload

ps. docker 網站 https://hub.docker.com/r/stilliard/pure-ftpd

用docker安裝視訊會議 jitsi-meet

jitsi 大名鼎鼎, 我們公司用了10年的openfire內部即時通訊(xmpp server), 用戶端就是用jitsi(我都簡稱神燈巨人).

多年前發現 jitsi 有meet套件可以套用在openfire裡面, 使用結果好爛幾乎不能用, 用ubuntu安裝,也一直很不穩定, 改版很頻繁.

隨著新冠病毒出現, 節神 丟出開源視訊這個議題,我才想起應該是時候,要再測試看看了, 試用結果還不錯,可以讓公司的人使用.

**經過多次測試, 建議使用 "虛擬機加單個對外ip網卡" (非docker,無nat) 才能真正穩定 - 2020/05/06

https://github.com/jitsi/docker-jitsi-meet

# 先想好要用哪個主機名稱, 先把letsencrypt搞定
certbot-auto certonly --standalone --preferred-challenges http -d <full host name>

1.
# root
# 下載最新的版本, 複製預設的設定檔案
git clone https://github.com/jitsi/docker-jitsi-meet && cd docker-jitsi-meet
cp env.example .env

1.1 安全性增加了
./gen-passwords.sh

2.修改 .env , 視自己docker狀況調整以下參數
CONFIG=~/.jitsi-meet-cfg
# Exposed HTTP port
HTTP_PORT=8000

# Exposed HTTPS port
HTTPS_PORT=8443

# System time zone
# 這我調整taipei
TZ=Asia/Taipei

# Public URL for the web service 
# 這我是沒調整,因為我是用httpd reverse proxy
#PUBLIC_URL=https://<full host name>

ENABLE_LETSENCRYPT=1
# 告訴 jitsi 說我的letsencrypt是什麼
LETSENCRYPT_DOMAIN=<full host name>

3.依照.env的 CONFIG 參數, 建立相關目錄
mkdir -p ~/.jitsi-meet-cfg/{web/letsencrypt,transcripts,prosody,jicofo,jvb}

4.視情況修改 docker-compose.yml 
        volumes:
            - ${CONFIG}/web:/config
            - /etc/letsencrypt:/etc/letsencrypt
            - ${CONFIG}/transcripts:/usr/share/jitsi-meet/transcripts

5.上線兼啟動(這部份讓人產生錯覺,很快網頁可以連線,但實際上要5分鐘才正常,畢竟用了4個container)
docker-compose up -d

6.修改解析度(這我沒怎麼測試,預設是720,為了頻寬著想,所以改480)
# ~/.jitsi-meet-cfg 這個目錄依剛開始安裝的.env設定而不同
cd ~/.jitsi-meet-cfg/web
vi config.js
##
     constraints: {
         video: {
             aspectRatio: 16 / 9,
             height: {
                 ideal: 480,
                 max: 480,
                 min: 240
             }
         }

     },

Optional

1. 啟用認證
# 修改 .env 啟用登入認證(我使用最基本的內部認證, ldap怎麼都不成功...XD)
# Enable authentication
ENABLE_AUTH=1
# Enable guest access
ENABLE_GUESTS=0
# Select authentication type: internal, jwt or ldap
AUTH_TYPE=internal

1.1 啟用內部認證後,如何新增使用者
# 進入container
docker exec -it docker-jitsi-meet_prosody_1 bash
# 建立使用者,後面那串meet.jitsi不需要修改哦
prosodyctl --config /config/prosody.cfg.lua register <使用者名稱> meet.jitsi 

2. 增加google日曆功能

1 先想好使用哪個google 帳號讓大家能自由存取,可個人帳號也可使用g suite帳號
建議該帳號的calendar只用來預約會議室使用

2 登入進入 https://console.cloud.google.com/apis/dashboard 
新增project,進入Credentials新增 OAuth 2.0 client IDs , 新增後會給你一個client id,記下來
xxxx.apps.googleusercontent.com

3 進入 AAuth consent screen , 設定該 auth 的使用範圍
4 修改 vi ~/.jitsi-meet-cfg/web/config.js
啟用google calendar , 加上先前的client id,
enableCalendarIntegration: true,
googleApiApplicationClientID:”xxx.apps.googleusercontent.com”,
5.重啟
cd ~/docker-jitsi-meet/ ; docker-compose restart
6 登入jitsi meet 進行相關授權, 若出現未經允許存取calendar,就不管了,允許吧.

https://github.com/jitsi/jitsi-meet/blob/master/doc/integrations.md

簡易筆記-使用docker安裝iredmail

iredmail 是一個很強大的軟件,看文件開發者應該是大陸人,很牛!

我12年前就開始用這個軟件, 而且現在還在用!

雖說免費版不支持微軟的AD, 但很多小公司本來就沒有這些配置, 所以沒差.

目前這系統現在已經很穩定很成熟, 非常很適合小公司使用, 大推薦,

而且最近我才發現一位應該是俄羅斯人有持續提供docker安裝方式. https://hub.docker.com/r/lejmr/iredmail , 又更方便了.

以下是我安裝的心得, 有空會持續更新

1. 用volume的方式與docker建立對應, 方便以後備份升級
2. 與官網建議的不同,我移除灰名單模組,這東西又愛又恨,愛的是擋廣告很猛,恨的是要對方重發信,常常被使用者罵收信很慢.
3. 安裝後, 輸入 https://ip:8443/iredadmin  就可以用postmaster@<網域> 登入, 接下來就可以新增網域,或是使用者.
4. 輸入https://ip:8443/mail , 或是 https://ip:8443/sogo 
   使用者登入@<網域>  就可以收發信了
5. 使用管理者也可以收信, 最初系統自行發送的三封信很重要, 例如要dns設定DKIM之類的
6. 我有將/etc/letsencrypt 對應到iRedMal,打算用來取代自簽的證書
docker volume create iredmail_mysql
docker volume create iredmail_vmail
docker volume create iredmail_clamav
docker volume create iredmail_log
docker volume create iredmail_postfix_conf
docker volume create iredmail_amavisd_conf
docker run -p 8443:443 -p 110:110 -p 25:25 -p 587:587 -p 143:143 -p 993:993 -p 995:995 \
            -h <主機名稱(含網域),hostname.domain> \
            -d --restart always \
            -e "MYSQL_ROOT_PASSWORD=password" \
            -e "SOGO_WORKERS=1" \
            -e "TZ=Asia/Taipei" \
            -e "POSTMASTER_PASSWORD={PLAIN}password" \
            -e "IREDAPD_PLUGINS=['reject_null_sender', 'reject_sender_login_mismatch', 'throttle', 'amavisd_wblist', 'sql_alias_access_policy']" \
            -v iredmail_mysql:/var/lib/mysql \
            -v iredmail_vmail:/var/vmail \
            -v iredmail_clamav:/var/lib/clamav \
            -v iredmail_log:/var/log \
            -v iredmail_postfix_conf:/etc/postfix \
            -v iredmail_amavisd_conf:/etc/amavisd \
            -v /etc/letsencrypt:/etc/letsencrypt \
            -v /etc/letsencrypt/live/<主機網域>/privkey.pem:/etc/ssl/private/iRedMail.key \
            -v /etc/letsencrypt/live/<主機網域>/fullchain.pem:/etc/pki/tls/certs/iRedMail.crt \
            --name=iredmail lejmr/iredmail:mysql-latest

經過試用一個月, 有一個目前無法解決的問題,就是重開docker時,dovecot或mysql會殘留舊的pid,造成dovecot與mysql啟動失敗的狀況, 此時只能手動刪除 /var/run/dovecot/master.pd or /var/lib/mysql/mysql.sock 等檔案, 然後再切換目錄到/services 找出重啟的shell scripts ,才能解決問題

好消息是官方也著手進行iredmail docker官方版 https://hub.docker.com/r/iredmail/mariadb
目前還是beta狀態,不適合正式上戰場,但我很期待 - 2020/05/06

CentOS 8安裝docker-ce

第一次安裝CentOS 8 , 也第一次在上面安裝docker-ce版本,因此記錄下來版本不一致衝突的解決方式

簡單的敘述就是 CentOS 8 目前的containerd-io 版本低於 1.2.2-3 , 無法安裝docker-ce 19版本 , 處理方式就是先手動安裝大於1.2.2-3的containerd-io

dnf install -y epel-release
dnf update
dnf install -y yum-utils  device-mapper-persistent-data lvm2
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
## containerd.io-1.2.2-3以上
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
rpm -Uvh containerd.io-1.2.6-3.3.el7.x86_64.rpm
dnf -y  install docker-ce-cli docker-ce --nobest
systemctl enable docker
systemctl start docker
################################################
## 安裝完畢,請更改預設存放路徑
## 編輯 /lib/systemd/system/docker.service
## 找出
## ExecStart=/usr/bin/docker 
## 改成
## ExecStart=/usr/bin/docker  -g <你的新路徑>
################################################

使用docker安裝nextcloud

新版安裝方式請到這裡查看

-------------------以下是舊版安裝方式-------------------

  1. 建立volume
  2. 設定mariadb data
  3. 執行
  4. 設定trusted_domain

建立volume

 docker volume create nextcloud-www
 docker volume create nextcloud-app
 docker volume create nextcloud-config
 docker volume create nextcloud-data
 docker volume create nextcloud-theme 

確認 mariadb 資料庫伺服器是否準備好

執行docker指令

docker run -d -p <對應的port>:80 -v nextcloud-www:/var/www/html -v nextcloud-app:/var/www/html/custom_apps -v nextcloud-config:/var/www/html/config -v nextcloud-data:/var/www/html/data -v nextcloud-theme:/var/www/html/themes/mycustom --link <docker資料庫名稱>:mysql -e MYSQL_DATABASE=nextcloud -e MYSQL_USER=root -e MYSQL_PASSWORD=<密碼> -e MYSQL_HOST=mysql --restart=always --name nextcloud nextcloud 

若有apache或是nginx作為反向proxy, 將https帶到nextcloud, 需設定trust_domain(網站會提醒)

httpd設定

# for CalDav
RewriteEngine On 
RewriteRule ^/\.well-known/carddav https://%{SERVER_NAME}/remote.php/dav/ [R=301,L] RewriteRule ^/\.well-known/caldav https://%{SERVER_NAME}/remote.php/dav/ [R=301,L] 
# form redirect
<VirtualHost *:80>
    ServerName <server name>
    Redirect permanent / https://<server name>/
</VirtualHost>

<VirtualHost *:443> 
  # form security
  <IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
  </IfModule>
</VirtualHost>

nextcloud config設定

若使用httpd proxy 的方式需要加入以下設定, 以免登入轉圈圈無法進入頁面, 修改 config.php 檔案

'overwritehost' => '<主機名稱>',
'overwriteprotocol' => 'https',

執行command

 docker exec --user www-data <CONTAINER_ID> php occ 

超簡單安裝collabora online

collabora online 加上 nextcloud 或 owncloud 可以實現線上協同編輯的功能, 很猛!

docker run -t -d -p 9980:9980 -e "domain=<your-dot-escaped-domain>" -e "username=admin" -e "password=your_password" --restart always --name collabora collabora/code
EX:
docker run -t -d -p 9980:9980 -e "domain=next\\.fromtw\\.com" -e "username=admin" -e "password=your_password" --restart always --name collabora collabora/code 

以上安裝collabora online 指令中, domain=nextcloud\\.fromtw\\.com代表允許next.fromtw.com這個網址使用協同編輯,

若需要多個網址,請加上 |

記得搭配 letsencrypt 讓collabora 擁有 https 加密功能 ,   安裝完畢,

ps. 網址https://collabora.fromtw.com/loleaflet/dist/admin/admin.html , 可查詢是否成功.(需輸入以上設定帳密)

**nextcloud,

找出 collabora online app 並安裝 , 並設定collabora online的https網址, 這樣就能實現文件線上協同編輯的功能.

**owncloud,

需要到 https://marketplace.owncloud.com/apps/richdocuments 這個地方下載, 然後複製到owncloud app區解開才能安裝, 安裝後找出設定,把collabor的網址輸入進去就可以使用了

ps. 若collabora online 為內部service, 需要透過對外的httpd proxy接應, 因此httpd proxy的設定如下:

 <VirtualHost *:443>
  ServerName collabora.fromtw.com:443
  Options -Indexes

  # SSL configuration, you may want to take the easy route instead and use Lets Encrypt!
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/collabora.fromtw.com/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/collabora.fromtw.com/privkey.pem
  SSLCACertificateFile /etc/letsencrypt/live/collabora.fromtw.com/fullchain.pem
  SSLProtocol             all -SSLv2 -SSLv3
  SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
  SSLHonorCipherOrder     on

  # Encoded slashes need to be allowed
  AllowEncodedSlashes NoDecode

  # Container uses a unique non-signed certificate
  SSLProxyEngine On
  SSLProxyVerify None
  SSLProxyCheckPeerCN Off
  SSLProxyCheckPeerName Off

  # keep the host
  ProxyPreserveHost On

  # static html, js, images, etc. served from loolwsd
  # loleaflet is the client part of Collabora Online
  ProxyPass           /loleaflet https://127.0.0.1:9980/loleaflet retry=0
  ProxyPassReverse    /loleaflet https://127.0.0.1:9980/loleaflet

  # WOPI discovery URL
  ProxyPass           /hosting/discovery https://127.0.0.1:9980/hosting/discovery retry=0
  ProxyPassReverse    /hosting/discovery https://127.0.0.1:9980/hosting/discovery

  # Capabilities
  ProxyPass           /hosting/capabilities https://127.0.0.1:9980/hosting/capabilities retry=0
  ProxyPassReverse    /hosting/capabilities https://127.0.0.1:9980/hosting/capabilities

  # Main websocket
  ProxyPassMatch "/lool/(.*)/ws$" wss://127.0.0.1:9980/lool/$1/ws nocanon

  # Admin Console websocket
  ProxyPass   /lool/adminws wss://127.0.0.1:9980/lool/adminws

  # Download as, Fullscreen presentation and Image upload operations
  ProxyPass           /lool https://127.0.0.1:9980/lool
  ProxyPassReverse    /lool https://127.0.0.1:9980/lool
  ProxyPass / https://localhost:9980/
  ProxyPassReverse / https://localhost:9980/
</VirtualHost>

docker 安裝pptpd vpn

1. 安裝

docker volume create pptp-chap 
docker run -d --name pptpd --restart always --privileged --net=host  -v pptp-chap:/etc/ppp mobtitude/vpn-pptp

2. 修改密碼檔案(volumes/是docker的volumes目錄, pptp-chap是docker的volumes代號)

cd <你的volume目錄>
vi  pptp-chap/_data/chap-secrets
username    *           password    *

3. 加上防火牆

firewall-cmd --permanent --zone=public --direct --add-rule ipv4 filter INPUT 0 -p gre -j ACCEPT
firewall-cmd --permanent --zone=public --add-port=1723/tcp
firewall-cmd --permanent --zone=public --add-masquerade
firewall-cmd --reload

參考連結

https://github.com/mobtitude/docker-vpn-pptp

docker 安裝 restyaboard (一種看板軟體)

**安裝前必須先安裝postgres (因為restyaboard是docker安裝, 因此postgres也建議用docker安裝)

也必須先行建立資料庫 restyaboard , 存取的使用者,與密碼 ,

docker run --rm -d -e POSTGRES_DB='restyaboard' \
-e POSTGRES_HOST='postgres' \
--link <docker postgres名稱>:postgres \
-e POSTGRES_PASSWORD='admin' \
-e POSTGRES_USER='admin' \
-p 8080:80 \
--name restyaboard restyaplatform/restyaboard:dev

完成後, 可以http登入8080 ,

輸入預設帳號admin , 密碼restya

docker安裝postgres

安裝很簡單, 預設的管理者帳號是 postgres , 密碼就是底下所設定的密碼

docker volume create postgres-data 
docker run --name postgres -v postgres-data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=<密碼> -d postgres

如何登入

docker exec -it postgres  bash

登入後輸入 su - postgres

變身成 postgres之後, 

再下psql 就可以進入postgres世界了

但是指令就很不習慣,只能列出一些剛剛用到的,以後想到再補上

$ sudo -u postgres psql
-- List all databases via \l (or \list), or \l+ for more details
postgres=# \l Name | ... -----------+----------- postgres | ... template0 | ... template1 | ... postgres=# CREATE DATABASE mytest; $ sudo -u postgres createuser --login --pwprompt testuser Enter password for new role: xxxx # Create a new database called testdb, owned by testuser. $ sudo -u postgres createdb --owner=testuser testdb

 

docker安裝gitlab

很方便, 也很簡單

1. docker volume create  gitlab-config 
2. docker volume create gitlab-logs
3. docker volume create gitlab-data
4.
docker run -d --hostname <主機名稱> -p<外部對應http>:80 -p
<外部對應https> :443 --name gitlab --restart always --volume gitlab-config:/etc/gitlab --volume gitlab-logs:/var/log/gitlab --volume gitlab-data:/var/opt/gitlab gitlab/gitlab-ce:latest
5. 設定檔案在 gitlab-config/gitlab.rb
若不需要http ,可加上external_url "https://主機名稱" ,
若不需要 leetsencrypt , 請加上 letsencrypt['enable'] = false

2019/10/07 後記

後來gitlab一直更新, 想說docker pull gitlab/gitlab-ce:latest
以前天真的以為這樣就好了, docker上面的gitlab就會自動變成最新版,
沒想到以前的latest跟現在的latest是不同的
所以我就很瀟灑的砍掉目前docker上正在跑的gitlab ,反正設定檔案都在volume
砍掉之後, 重新執行以上的第四步驟
發現起不來, 於是找了很久找到 log 裡面一個 reconfigure 的目錄, 看了一下目錄裡面最新的檔案,才發現gitlab的自動升級功能有提醒版本過舊, 但是我不知道舊的版本是啥.
最後終於找到以前gitlab的image id (可以使用docker images 指令找) , 再去docker上找出一樣的images id 就能知道版本了, 於是再慢慢升級, 因為 gitlab 無法跳躍式升級, 需要一版接一版, 最後就成功升級到最新版了

1 2 3