deployphp / deployer

The PHP deployment tool with support for popular frameworks out of the box
https://deployer.org
MIT License
10.51k stars 1.48k forks source link

Detect Motd and warn users about it #2969

Closed antonmedv closed 2 days ago

antonmedv commented 2 years ago

YAML

import: 
    - recipe/laravel.php
    - contrib/php-fpm.php
    - contrib/npm.php

config:
  application: website
  branch: main
  base_deploy_path: /srv/users/serverpilot/apps
  config_file: ~/.ssh/config
  php_fpm_service: php7.4-fpm-sp
  remote_user: serverpilot
  repository: git@github.com:user/website.git
  shared_dirs:
    - users
  ssh_multiplexing: true
  writable_dirs:
    - storage/statamic

hosts:
  production:
    deploy_path: '{{base_deploy_path}}/{{application}}'
    hostname: domain.com
  staging:
    deploy_path: '{{base_deploy_path}}/staging-{{application}}'
    hostname: staging.domain.com

tasks:
  deploy:
    - deploy:prepare
    - deploy:vendors
    - artisan:storage:link
    - artisan:view:cache
    - artisan:config:cache
    - artisan:optimize
    - npm:install
    - npm:run:production
    - please:cache:clear
    - deploy:publish
    - php-fpm:reload
  npm:run:production:
    script:
      - 'cd {{release_or_current_path}} && npm run production'
  please:assets:meta:
    script:
      - 'cd {{release_or_current_path}} && php please assets:meta'
  please:git:commit:
    script:
      - 'cd {{release_or_current_path}} && php please git:commit'
  please:glide:clear:
    script:
      - 'cd {{release_or_current_path}} && php please glide:clear'
  please:cache:clear:
    script:
      - 'cd {{release_or_current_path}} && php please cache:clear'

after:
  deploy:failed: deploy:unlock

Here is the error

[staging] run cd /srv/users/serverpilot/apps/staging-website && ([ -f /srv/users/serverpilot/apps/staging-website/.dep/repo/HEAD ] || **********************************************************************
*  Learn about SSH, SFTP, PHP, MySQL, apps, cron, and more at:       *
*  https://serverpilot.io/community/articles/system-user-guide       *
*                                                                    *
*  To use a specific PHP version for the 'php' command, see:         *
*  https://serverpilot.io/community/articles/how-to-use-the-php-cli  *
**********************************************************************
/usr/bin/git clone --mirror git@github.com:user/website.git /srv/users/serverpilot/apps/staging-website/.dep/repo 2>&1)
[staging] **********************************************************************
[staging] *  Learn about SSH, SFTP, PHP, MySQL, apps, cron, and more at:       *
[staging] *  https://serverpilot.io/community/articles/system-user-guide       *
[staging] *                                                                    *
[staging] *  To use a specific PHP version for the 'php' command, see:         *
[staging] *  https://serverpilot.io/community/articles/how-to-use-the-php-cli  *
[staging] **********************************************************************
[staging] bash: line 1: release: command not found
[staging] bash: line 2: release: command not found
[staging] bash: line 3: release: command not found
[staging] bash: line 4: release: command not found
[staging] bash: line 5: release: command not found
[staging] bash: line 6: release: command not found
[staging] bash: line 7: release: command not found

Here is the fix

  1. Edit the following file: /etc/profile.d/serverpilot-login-message.sh
  2. Delete the following lines to remove the Message of the day:
    elif [[ "$HOME" == /srv/users/* ]]; then
    echo "**********************************************************************"
    echo "*  Learn about SSH, SFTP, PHP, MySQL, apps, cron, and more at:       *"
    echo "*  https://serverpilot.io/community/articles/system-user-guide       *"
    echo "*                                                                    *"
    echo "*  To use a specific PHP version for the 'php' command, see:         *"
    echo "*  https://serverpilot.io/community/articles/how-to-use-the-php-cli  *"
    echo "**********************************************************************"

Originally posted by @pryley in https://github.com/deployphp/deployer/discussions/2542

Upvote & Fund

Fund with Polar

MaximeOh commented 2 years ago

I think it's not a complete solution to only warn users about it. If Motd cannot be removed from server, DeployerV7 seems to be not usable. Maybe Deployer can detect Motd and before each remote command, filter result to remove it.

antonmedv commented 2 years ago

Yes, this is also possible. Let’s implement it as well. For example as configurable regexp.

MaximeOh commented 2 years ago

Configurable Regexp seems to be a good idea and the most powerful solution.

The Hostinger Motd contains static and dynamic parts.

   HHHH               HHHH
   HHHHHHHH           HHHHHHHH
   HHHHHHHH           HHHHHHHH
   HHHHHHHH           HHHHHHHH
   HHHHHHHHHHHHHHHHHHHH  HHHHH
   HHHHHHHHHHHHHHHHHHHHHHHHH
     HHHHHHHHHHHHHHHHHHHHHHHHH
   HHHH  HHHHHHHHHHHHHHHHHHHHH
   HHHHHHHH           HHHHHHHH
   HHHHHHHH           HHHHHHHH
   HHHHHHHH           HHHHHHHH
       HHHH               HHHH

Welcome back! The time now is 17:14 UTC
Server load: 15.51, 16.41, 16.67

Link to hPanel: 
https://hpanel.hostinger.com/ 
antonmedv commented 2 years ago

Maybe create a list of predefined motd for popular services?

antonmedv commented 2 years ago

Do you use ssh multiplexing?

MaximeOh commented 2 years ago

Yes, i use ssh multiplexing because it's the default value of Deployer option. But i try to deactivate it, and there is no difference.

I'm trying to deploy a classical CakePhp4 WebApp, the task tree is a basic case.

The task-tree for deploy:
└── deploy
    ├── deploy:prepare
    │   ├── deploy:info
    │   ├── deploy:setup
    │   ├── deploy:lock
    │   ├── deploy:release
    │   ├── deploy:update_code
    │   ├── deploy:shared
    │   └── deploy:writable
    ├── deploy:vendors
    ├── deploy:init
    ├── deploy:run_migrations
    └── deploy:publish
        ├── deploy:symlink
        ├── deploy:unlock
        ├── deploy:cleanup

I try each task individually until the update_code task and there is no problem with motd.

I discover deployerV7 since couple days, i use it since the V4 and next version, the motd never produce problem.

lfolco commented 1 year ago

I am running into this issue when using the test() function, it's messing up the results and returning false every time.

iBotPeaches commented 10 months ago

We just upgraded some projects (yeah really delayed) and hit this. Oddly while the spammed MOTD over n over was annoying in older versions - it still worked.

It seems after some investigation that after this commit - https://github.com/deployphp/deployer/commit/da8bb1adffab871c94305c47d34beb10ac2c51da, it broke.

Since it would get stuck an infinite loop. I doubt I'll have any luck, but I requested our client to ask if Hostinger can remove the MOTD as its quite annoying and doesn't look configurable in my research.

   HHHH               HHHH
   HHHHHHHH           HHHHHHHH
   HHHHHHHH           HHHHHHHH
   HHHHHHHH           HHHHHHHH
   HHHHHHHHHHHHHHHHHHHH  HHHHH
   HHHHHHHHHHHHHHHHHHHHHHHHH
     HHHHHHHHHHHHHHHHHHHHHHHHH
   HHHH  HHHHHHHHHHHHHHHHHHHHH
   HHHHHHHH           HHHHHHHH
   HHHHHHHH           HHHHHHHH
   HHHHHHHH           HHHHHHHH
       HHHH               HHHH

Welcome back! The time now is 18:32 UTC
Server load: 19.28, 19.43, 20.37

Link to hPanel: 
https://hpanel.hostinger.com/ 
iBotPeaches commented 10 months ago

Okay, we fixed without code changes. Explained below. In short though - I wish clients didn't use Hostinger and used a solution that is more in-tune with hosting Laravel. So with that rant out of the way.

The name of the game is setting up values ahead of time.

# You must set `git` yourself, otherwise the MOTD will meld with command and lead to crash.
set('bin/git', '/usr/bin/git');

# Hostinger default php version is 8.0, you probably don't want that.
set('bin/php', '/opt/cloudlinux/alt-php82/root/usr/bin/php');

# Hostinger default composer is composer1, wtf seriously. We must invoke composer2 with the php version we want from above
set('bin/composer', '/opt/cloudlinux/alt-php82/root/usr/bin/php /usr/local/bin/composer2');

# We must remove the login shell to hide the MOTD. This is important.
set('shell', 'bash');

# Hostinger won't allow ACL changes, use chmod
set('writable_mode', 'chmod');

# Hardcode user/group that you need because Hostinger won't expose that in ps aux
set('http_user', 'uXXX');
set('http_group', 'oXXX');
github-actions[bot] commented 2 days ago

This issue has been automatically closed. Please, open a discussion for bug reports and feature requests.

Read more: [https://github.com/deployphp/deployer/discussions/3888]