最初版本
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
import os, sys, time
|
||||
import paramiko
|
||||
|
||||
HOST = "20.191.152.26"
|
||||
USER = "wakka"
|
||||
PASSWORD = os.environ["DEPLOY_PASSWORD"]
|
||||
REMOTE_DIR = "/home/wakka/guest-cs-stack"
|
||||
LOCAL_STACK = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
FILES = [
|
||||
"docker-compose.chat.yaml",
|
||||
"docker-compose.chat.remote.yaml",
|
||||
"chatwoot.env",
|
||||
"guest-cs.env",
|
||||
"guest-cs.remote.env",
|
||||
"bootstrap-chatwoot.sh",
|
||||
]
|
||||
|
||||
INSTALL_DOCKER = r"""
|
||||
set -e
|
||||
if ! command -v docker >/dev/null 2>&1; then
|
||||
echo "[install] docker..."
|
||||
sudo apt-get update -qq
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker.io docker-compose-v2
|
||||
sudo usermod -aG docker wakka || true
|
||||
fi
|
||||
docker --version
|
||||
docker compose version
|
||||
"""
|
||||
|
||||
DEPLOY = rf"""
|
||||
set -euo pipefail
|
||||
cd {REMOTE_DIR}
|
||||
echo "[deploy] stop old python app on 7777..."
|
||||
pkill -f "python app.py" 2>/dev/null || true
|
||||
fuser -k 7777/tcp 2>/dev/null || true
|
||||
sleep 2
|
||||
echo "[deploy] pull..."
|
||||
docker pull ladioussuapp/guest-chat:latest
|
||||
echo "[deploy] up..."
|
||||
docker compose -f docker-compose.chat.yaml -f docker-compose.chat.remote.yaml down 2>/dev/null || true
|
||||
docker compose -f docker-compose.chat.yaml -f docker-compose.chat.remote.yaml up -d --force-recreate
|
||||
sleep 25
|
||||
docker compose -f docker-compose.chat.yaml -f docker-compose.chat.remote.yaml ps
|
||||
curl -sI http://127.0.0.1:7777/guest-customer-service | head -8
|
||||
"""
|
||||
|
||||
|
||||
def run(client, cmd, timeout=900):
|
||||
print("\n>>>", cmd[:120].replace("\n", " "))
|
||||
_, o, e = client.exec_command(cmd, timeout=timeout)
|
||||
out = o.read().decode("utf-8", errors="replace")
|
||||
err = e.read().decode("utf-8", errors="replace")
|
||||
code = o.channel.recv_exit_status()
|
||||
if out:
|
||||
print(out)
|
||||
if err:
|
||||
print(err, file=sys.stderr)
|
||||
return code, out, err
|
||||
|
||||
|
||||
def main():
|
||||
c = paramiko.SSHClient()
|
||||
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||
c.connect(HOST, username=USER, password=PASSWORD, timeout=30)
|
||||
run(c, "hostname; pwd; ls -la app.py 2>/dev/null; ps aux | grep 'python app' | grep -v grep")
|
||||
|
||||
code, _, _ = run(c, INSTALL_DOCKER, timeout=900)
|
||||
if code != 0:
|
||||
return code
|
||||
|
||||
# re-connect after docker group change may need new session with docker group
|
||||
c.close()
|
||||
time.sleep(2)
|
||||
c = paramiko.SSHClient()
|
||||
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||
c.connect(HOST, username=USER, password=PASSWORD, timeout=30)
|
||||
|
||||
run(c, f"mkdir -p {REMOTE_DIR}")
|
||||
sftp = c.open_sftp()
|
||||
for name in FILES:
|
||||
sftp.put(os.path.join(LOCAL_STACK, name), f"{REMOTE_DIR}/{name}")
|
||||
print(f"uploaded {name}")
|
||||
sftp.close()
|
||||
|
||||
# use sudo docker if group not active yet
|
||||
deploy_cmd = DEPLOY.replace("docker ", "sudo docker ")
|
||||
code, out, _ = run(c, deploy_cmd, timeout=900)
|
||||
c.close()
|
||||
return code
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user