Sail is a free CLI tool to deploy, manage and scale WordPress applications in the DigitalOcean cloud.

Overview

Deploy WordPress to DigitalOcean with Sail

Sail is a free CLI tool to deploy, manage and scale WordPress applications in the DigitalOcean cloud.

Contents:

Installing Sail

Using Homebrew (Linux, MacOS, WSL on Windows)

The easiest and preferred way to install Sail and keep it up to date, is through the Homebrew package manager. It works on MacOS, Linux, and Windows (via WSL):

brew install sail

If you're new to Howebrew, installing it is quite a breeze as well.

From PyPI

If you already use Python and pip, you can obtain the latest version of Sail from PyPI:

pip3 install sailed.io

From Source

You will need Python 3.6+ with pip and setuptools available. Download the source files from GitHub, install dependencies and run the Sail installation:

pip3 install -r requirements.txt
python3 setup.py install

Consider installing in a virtual environment, to make sure dependencies aren't broken for other Python software on the system:

python3 -m venv .env
.env/bin/pip install -r requirements.txt
.env/bin/python setup.py install
ln -s .env/bin/sail /usr/local/bin/sail

Getting a DigitalOcean API Token

Sail uses the DigitalOcean API to interact with cloud services, for which you'll need a DigitalOcean account, as well as a read-write API token.

Account

If you don't already have an account, you can sign up for DigitalOcean using our affiliate link which grants you $100 in free credits, and a small commission to our project account. If you would rather not sign up using an affiliate link, just browse to www.digitalocean.com

API Token

To create a DigitalOcean API token, sign in to your account, browse to API > Tokens/Keys, and hit the Generate New Token button. Give it a descriptive name, for example "sail", and make sure both Read and Write scopes are selected.

After generating the token, it'll show up in the list of personal acckss tokens, you'll see the token itself directly below the token name. Copy that token and store it in a safe place.

Creating a New Sail Project

Create an empty directory for your new project, and from there run:

sail init --provider-token= --email=

This will initialize your project, provision services, and download your first working copy of your new WordPress application. Once successful, you'll see the URL and the wp-admin credentials.

If you're planning to use Sail for multiple projects, you should consider saving your provider token and admin e-mail address to sail config as defaults:

sail config provider-token 
sail config email 

This way you can simply:

sail init

If you'd like to migrate an existing WordPress application into a Sail-powered project, you'll still need to provision a new project first. For more information take a look at Migrating existing projects to Sail.

Selecting a Droplet Size and Region

By default Sail will deploy a small s-1vcpu-1gb-intel droplet in the ams3 (Amsterdam 3) region. You can change these with the --size and --region arguments respectively:

sail init --size=s-2vcpu-4gb-amd --region=sfo2

You can grab a list of valid sizes and regions with sail sizes and sail regions respectively.

Domains and DNS

Sail provisions your new site with a random-hash.sailed.io subdomain. This is used internally by Sail and Sail Services. You can add your own custom domains to your application with Sail:

sail domain add example.org

This will create a DNS record on your DigitalOcean account, pointing to your application droplet. You can add multiple domains and subdomains by providing a space-separated list.

When the records are added, you'll need to change the name server records for your domain, at your domain registrar, to point to DigitalOcean:

  • ns1.digitalocean.com
  • ns2.digitalocean.com
  • ns3.digitalocean.com

Here's a tutorial on how to do that for common domain registrars.

Note: When moving DNS from another provider to DigitalOcean, don't forget to copy all existing records from that provider, including MX, TXT and CNAME records.

If you fail to do this, you may break some third-party services, such as e-mail, transactional mail, Google search console verification, and others.

While not officially supported, you can add a subdomain to your Sail application while leaving your DNS hosted elsewhere. To do this, add a CNAME record for your subdomain at your DNS provider, and point it to your .sailed.io subdomain.

SSL and HTTPS

After the name server records are updated and your domain is pointing to your WordPress application, you can ask Sail to request and install a free SSL certificate from Let's Encrypt:

sail domain make-https example.org www.example.org

Issued certificates will be installed and renewed automatically on your droplet.

Primary Domains

After the domains have been added and SSL'd, you can change the primary domain of your WordPress application with Sail:

sail domain make-primary example.org

Deploying Changes

Any change that you make to your local working copy of a Sail project, can be deployed to production with sail deploy:

sail deploy

By default this will omit the wp-content/uploads directory, but could be included with the --with-uploads flag. This is particularly useful when importing existing applications to Sail.

You can run deploy with the --dry-run flag to get a list of file changes, which will be written to the production server during the deploy.

Rolling Back

In most failed deployment situations, it often makes sense to correct the mistake in your working copy and deploy again. However, sometimes you working copy might be dirty or in an unknown state, in which case the easiest and fastest way to resolve the problem would be a rollback.

A rollback simply changes the web root symlink on the production server to point to a release deployed earlier. This means that your working copy does not need to be transferred to production at all.

sail rollback 

To get a list of available releases, use:

sail rollback --releases

Sail keeps the last five releases on your production server, and deletes the older ones every time you deploy. These can be found in the /var/www/releases directory on your droplet.

Note that after a successful rollback, the production data will most likely be different from your working copy, so it might be a good idea to save the state of your working copy to your source repository, then download the live application files from production, as explained in the next section.

Downloading Changes from Production

In some cases your production code could be altered, for example when you update WordPress core, a theme or plugin. You can pull these changes down do your local copy with sail download:

sail download

Similar to deploying, if you would like to pull down all of wp-content/uploads as well, just add the --with-uploads flag.

By default, downloading with Sail will not delete files from your working copy, which do not exist on your production server. If a plugin or theme is deleted in production, you'll have to use the --delete flag to pull those changes back to your working copy.

Similar to deploy, the --dry-run flag will display a list of file changes that will occur during a download.

Creating a Backup

You can backup your WordPress application with Sail:

sail backup

This will download all your application files, your uploads, as well as a full dump of your MySQL database tables, compress and archive them to your local .backups directory.

Don't forget to backup your backups.

Restoring a Backup

Backup files created by Sail can easily be restored back to production:

sail restore .backups/backup-filename.tar.gz

Note that this is not an atomic operation (like deploy) as it restores files directly to the public folder on production. Uploads and the database are also restored from the backup archive, these can be skipped with --skip-uploads and --skip-db respectively.

A restored backup will not appear as a new release, so it can't easily be rolled back. It also does not affect the local working copy, which can become dirty as a result of this operation. It is recommended to use sail download after each restore.

Exporting and Importing the Database

Download a full database dump from production:

sail db export

This will write a compressed .sql.gz file to your .backups directory. Such files can be imported back to production:

sail db import .backups/filename.sql.gz

Regular .sql files can be imported too.

Accessing the Server and Application

You have full root access to every server you provision with Sail. There is no password for security reasons, but your root SSH key is saved to .sail/ssh.key after provisioning your application.

You can use this key directly with SSH or GUI SFTP software. Sail provides a handful of useful commands too:

Open an interactive SSH shell to your application:

sail ssh

This will open a session as the www-data user, inside the application container on the /var/www/public directory. If you'd rather open a root session on your host droplet, just add --root or --host to the command.

The host server will contain the original /var/www directory, with all your application releases, as well as your SSH service configuration in /etc/ssh. So it's not all that useful, though you can use it to reboot your server for example.

The remaining services run inside a container named sail, which you can access from the host droplet with Docker:

docker exec -it sail bash

There you will have access to /etc/nginx, /etc/php, /etc/mysql and everything else. Remember: with great power comes great responsibility.

Here are a few other useful things you can do with Sail.

Run a WP-CLI command or spawn a WP-CLI interactive shell:

sail wp option get home
sail wp shell

Spawn an interactive MySQL shell:

sail db cli

Open your browser to your application's wp-login.php location:

sail admin

Accessing Logs

You can query your Nginx, PHP and system logs directly from Sail:

sail logs
sail logs --nginx
sail logs --php

Add --follow or -f to tail-follow the logs, really useful while debugging.

Integrating with Git

It is always a great idea to use Git or other modern source code management systems when working with WordPress applications. Sail does not depend on any particular flavor, nor does it require the use of one at all.

However, if you do choose to work with one, make sure you ignore the .sail and .backups directories from source control. It's a good idea to ignore all dot-files anyway. You will probably not want your wp-content/uploads directory in source control either.

Here's an example .gitignore file:

.*
wp-content/uploads
wp-content/upgrade

Note, that during a deploy, everything in your working copy, except dot files and uploads, will be shipped to your production server's public directory, even files that are not under source control.

TODO: Deploy on push with GitHub Actions

Migrating existing projects to Sail

Provisioning new sites with Sail is great, but often times you'll want to migrate an existing WordPress application to DigitalOcean with Sail. Here's a useful checklist to help you out.

  1. Provision a new application with Sail
  2. Download a full backup from your current provider
  3. Copy the application files and wp-content/uploads, but not your wp-config.php to your new Sail working copy
  4. Merge the wp-config.php file by hand, database credentials should remain the ones provided by Sail, everything else is up to you
  5. Import the database .sql file from your local computer with sail db import path/to/database.sql
  6. Use sail deploy --with-uploads to push your application files and uploads to production
  7. Add your domains and select a primary one with sail domain add and sail domain make-primary

If everything is looking good, you should point your domain to Sail as described in the Domains and DNS section. After DNS propagation is complete you should be able to request and install new SSL certificates for your application.

License and Contributing

The Sail CLI client is free and open source, distributed under the GNU General Public License version 3. Feel free to contribute by opening an issue or pull request on our GitHub project.

The Sail API server is proprietary and runs on the sailed.io domain. It is used by most core Sail CLI commands and features, including but not limited to provisioning, deploying, domain management and more.

Legal

This software is provided as is, without warranty of any kind. Sail authors and contributors are not responsible for any loss of content, profits, revenue, cost savings, data, or content, or any other direct or indirect damages that may result from using the software or services provided by sailed.io. DigitalOcean terms of service can be found here. DigitalOcean is a trademark of DigitalOcean, LLC.

Comments
  • Error adding DNS record for multi-part TLDs

    Error adding DNS record for multi-part TLDs

    Hi, I'm sorry to bother you again but I'm having another problem. I can't add my domain .com.br (Brazil ccTLD), what could be causing this error?

    sail domain add growthdesigner.com.br
    
    # com.br
    - Error adding DNS record for growthdesigner.com.br: Add parent domain first
    
    bug 
    opened by marlonamancio 7
  • Error: Provisioning failed.

    Error: Provisioning failed.

    Hello, I managed to install Sail on my Macbook correctly, when provisioning an instance in DO the following error occurred:

    sail init --size=s-1vcpu-1gb-intel --region=sfo3 --provider-token=MY_TOKEN --email=MY_DO_EMAIL
    
    # Initializing
    - Init successful, application id: 0a837ebb0f3b33b9
    - Writing SSH keys to .sail/ssh.key
    - Writing .sail/config.json
    
    # Provisioning servers
    - Provision scheduled successfully, waiting...
    - Uploading SSH key to DigitalOcean
    - Creating a new Droplet
    - Waiting for Droplet to boot
    - Droplet up and running, creating DNS records
    
    Error: Provisioning failed. Please try again later.
    

    Then I tried to add a domain to the instance but the following error occurred:

    sail domain add MYDOMAIN.COM
    Error: API error: Not ready. Current status: installing
    

    I don't know what to do from now on. Could you give me a direction? Thanks

    opened by marlonamancio 5
  • Bump paramiko from 2.10.3 to 2.11.0

    Bump paramiko from 2.10.3 to 2.11.0

    Bumps paramiko from 2.10.3 to 2.11.0.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 4
  • Bump click from 8.1.2 to 8.1.3

    Bump click from 8.1.2 to 8.1.3

    Bumps click from 8.1.2 to 8.1.3.

    Release notes

    Sourced from click's releases.

    8.1.3

    This is a fix release for the 8.1.0 feature release.

    Changelog

    Sourced from click's changelog.

    Version 8.1.3

    Released 2022-04-28

    • Use verbose form of typing.Callable for @command and @group. :issue:2255
    • Show error when attempting to create an option with multiple=True, is_flag=True. Use count instead. :issue:2246
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 4
  • Support SSL for Mapped Subdomains

    Support SSL for Mapped Subdomains

    I've set up my first site with Sail and have been enjoying it. However, I ran into a snag when it came to adding SSL. I ran the following commands:

    sail domain add sub.example.com
    sail domain make-primary sub.example.com
    

    It was sail domain make-https sub.example.com which failed:

    sail domain make-https sub.example.com
    Let's Encrypt ToS: https://community.letsencrypt.org/tos
    Do you agree to the Let's Encrypt ToS? [y/N]: y
    # Requesting and installing SSL for domains
    - Scheduled make-https for sub.example.com
    - Waiting for make-https to complete
    - Generating Nginx configs for example.com
    - Requesting certificate from Certbot for group example.com
    Error: Task state failure
    

    As some additional context, the DNS record for sub.example.com was added in DigitalOcean but the root (example.com) is pointing to another droplet. Looks like what is happening is that sail is trying to first setup the domain as example.com So In etc/nginx/config.d I have an example.com folder where I'd expect to see sub.example.com. That may be a different bug and is less urgent but wanted to note it.

    I was able to get SSL working by manually modifying the server.

    sail ssh --root
    certbot -n certonly -m [email protected] --agree-tos --standalone --http-01-port 8088 --expand -d sub.example.com
    vi /etc/nginx/config.d/example.com
    

    And I added the following:

    listen 443 ssl; # managed by Certbot
    
        # RSA certificate
        ssl_certificate /etc/letsencrypt/live/sub.example.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/sub.example.com/privkey.pem; # managed by Certbot
    
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    
        # Redirect non-https traffic to https
        if ($scheme != "https") {
            return 301 https://$host$request_uri;
        } # managed by Certbot
    
    

    Then nginx restart and was good to go.

    I guess this is either a feature or a bug report depending on how you look at it for sail to support subdomains including SSH support.

    Thanks!

    opened by BrookeDot 4
  • Init links to an HTTPS version, even if Certbot was unsuccessful

    Init links to an HTTPS version, even if Certbot was unsuccessful

    Howdy! Was excited to give Sail a try but hit an immediate error with my first try. Running sail 0.9.12 on macOS 11.2.2 (m1 macbook air)

    sail init ran successfully but when I open the WP url https://b0dd8f888b61a6a6.sailed.io/ it's clear nginx isn't running correctly.

    Any ideas as to what the issue might be?

    bug 
    opened by colmtroy 4
  • Doc typo

    Doc typo

    Hello and thanks for the project,

    On Page: https://sailed.io/kb/init/

    sail init --provider_token=YOUR_TOKEN --email=ADMIN_EMAIL
    

    Should be

    sail init --provider_token=YOUR-TOKEN --email=ADMIN_EMAIL
    
    documentation 
    opened by Bowriverstudio 3
  • Premium: managed backups, image optimization/webp, monitoring

    Premium: managed backups, image optimization/webp, monitoring

    Work in progress on managed backups in this branch. To configure Sail Premium run:

    $ sail config premium LICENSE_KEY
    $ sail config email EMAIL
    

    If you'd like to help test these and future premium features, ask in Slack for a license key.

    Enable premium

    To enable premium features for an existing Sail project:

    $ sail premium enable
    

    If you're creating a new project with sail init, premium will be enabled for you during provision. Note that premium requires the Sail API to have SSH access to your server, which is why a new premium.key is generated and sent to the Sail API, as well as added to your application's /root/.ssh/authorized_keys file.

    With premium enabled, backups will run automatically on a remote backup storage service operated by us. Backups are created every day at 00:00 UTC. Remote on-demand backups can also be created via the CLI. All backups are retained for 60 days.

    List backups

    Get a list of remote backups:

    $ sail backup list
    +------------+---------------------+---------+------------------+
    | Timestamp  | Date/Time           | Size    | Description      |
    +------------+---------------------+---------+------------------+
    | 1639600748 | 2021-12-15 23:39:08 | 51.7MiB | Automatic backup |
    | 1639601047 | 2021-12-15 23:44:07 | 51.7MiB | Automatic backup |
    +------------+---------------------+---------+------------------+
    

    Backup info

    Get info about a remote backup:

    $ sail backup info TIMESTAMP
    $ sail backup info TIMESTAMP --json
    

    Restore backup

    Restore a remote backup:

    $ sail backup restore TIMESTAMP
    

    Create backup

    Create an on-demand backup:

    $ sail backup create --description="about to update a bunch of plugins"
    $ sail backup # alias for back-compat
    

    Export backup

    Export a backup for download:

    $ sail backup export TIMESTAMP
    # Exporting a remote backup
    - Waiting for task to complete
    - Export completed
    
    # Backup 1639597390
    - Status: ready
    - Date/Time: 2021-12-15 22:43:10
    - Size: 52.3MiB
    - Description: Manual backup
    - Export URL: https://backups.sailed.io/b539970d8c935a51-1639597390-fd91238a.tar.gz?AWSAccessKeyId=key&Expires=1639772446&Signature=signature
    - Export Expires: 2021-12-15 22:43:10
    

    Local backups (non-premium)

    By default Sail will try to create remote backups with a premium license enabled, so to force the non-premium behavior (create a local backup) you'll need the new --local flag:

    $ sail backup create --local
    $ sail backup --local # alias for back-compat
    

    The restore routine is smart enough to figure out whether you want to restore a remote backup or a local one:

    $ sail backup restore path/to/local/backup.tar.gz
    $ sail restore path/to/local/backup.tar.gz # alias
    
    premium 
    opened by kovshenin 2
  • Add .gitignore/.deployignore support for partial deploys?

    Add .gitignore/.deployignore support for partial deploys?

    Sometimes it's really necessary to exclude some folders from deploy. Example: local copy is used for development and there are all kinds of developer-only stuff there, like node_modules. Would be great to have an option where I can specify what folders/files to exclude from deploy at all times.

    enhancement 
    opened by acerus 2
  • Blueprints

    Blueprints

    Blueprints are coming soon to a sailboat near you.

    Blueprints will allow Sail users to specify a manifest YAML file, which declares which plugins and themes should be installed and activated, additional server software setup and configuration and more. Work in progress will be committed and tested on this branch, API changes will be deployed to the production API service.

    enhancement 
    opened by kovshenin 2
  • Bump requests from 2.27.1 to 2.28.0

    Bump requests from 2.27.1 to 2.28.0

    Bumps requests from 2.27.1 to 2.28.0.

    Release notes

    Sourced from requests's releases.

    v2.28.0

    2.28.0 (2022-06-09)

    Deprecations

    • ⚠️ Requests has officially dropped support for Python 2.7. ⚠️ (#6091)
    • Requests has officially dropped support for Python 3.6 (including pypy3). (#6091)

    Improvements

    • Wrap JSON parsing issues in Request's JSONDecodeError for payloads without an encoding to make json() API consistent. (#6097)
    • Parse header components consistently, raising an InvalidHeader error in all invalid cases. (#6154)
    • Added provisional 3.11 support with current beta build. (#6155)
    • Requests got a makeover and we decided to paint it black. (#6095)

    Bugfixes

    • Fixed bug where setting CURL_CA_BUNDLE to an empty string would disable cert verification. All Requests 2.x versions before 2.28.0 are affected. (#6074)
    • Fixed urllib3 exception leak, wrapping urllib3.exceptions.SSLError with requests.exceptions.SSLError for content and iter_content. (#6057)
    • Fixed issue where invalid Windows registry entires caused proxy resolution to raise an exception rather than ignoring the entry. (#6149)
    • Fixed issue where entire payload could be included in the error message for JSONDecodeError. (#6079)

    New Contributors

    Full Changelog: https://github.com/psf/requests/blob/main/HISTORY.md#2280-2022-06-09

    Changelog

    Sourced from requests's changelog.

    2.28.0 (2022-06-09)

    Deprecations

    • ⚠️ Requests has officially dropped support for Python 2.7. ⚠️ (#6091)
    • Requests has officially dropped support for Python 3.6 (including pypy3.6). (#6091)

    Improvements

    • Wrap JSON parsing issues in Request's JSONDecodeError for payloads without an encoding to make json() API consistent. (#6097)
    • Parse header components consistently, raising an InvalidHeader error in all invalid cases. (#6154)
    • Added provisional 3.11 support with current beta build. (#6155)
    • Requests got a makeover and we decided to paint it black. (#6095)

    Bugfixes

    • Fixed bug where setting CURL_CA_BUNDLE to an empty string would disable cert verification. All Requests 2.x versions before 2.28.0 are affected. (#6074)
    • Fixed urllib3 exception leak, wrapping urllib3.exceptions.SSLError with requests.exceptions.SSLError for content and iter_content. (#6057)
    • Fixed issue where invalid Windows registry entires caused proxy resolution to raise an exception rather than ignoring the entry. (#6149)
    • Fixed issue where entire payload could be included in the error message for JSONDecodeError. (#6036)
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 1
  • Bump packaging from 21.3 to 22.0

    Bump packaging from 21.3 to 22.0

    Bumps packaging from 21.3 to 22.0.

    Release notes

    Sourced from packaging's releases.

    22.0

    What's Changed

    ... (truncated)

    Changelog

    Sourced from packaging's changelog.

    22.0 - 2022-12-07

    
    * Explicitly declare support for Python 3.11 (:issue:`587`)
    * Remove support for Python 3.6 (:issue:`500`)
    * Remove ``LegacySpecifier`` and ``LegacyVersion`` (:issue:`407`)
    * Add ``__hash__`` and ``__eq__`` to ``Requirement`` (:issue:`499`)
    * Add a ``cpNNN-none-any`` tag (:issue:`541`)
    * Adhere to :pep:`685` when evaluating markers with extras (:issue:`545`)
    * Allow accepting locally installed prereleases with ``SpecifierSet``  (:issue:`515`)
    * Allow pre-release versions in marker evaluation (:issue:`523`)
    * Correctly parse ELF for musllinux on Big Endian (:issue:`538`)
    * Document ``packaging.utils.NormalizedName`` (:issue:`565`)
    * Document exceptions raised by functions in ``packaging.utils`` (:issue:`544`)
    * Fix compatible version specifier incorrectly strip trailing ``0`` (:issue:`493`)
    * Fix macOS platform tags with old macOS SDK (:issue:`513`)
    * Forbid prefix version matching on pre-release/post-release segments (:issue:`563`)
    * Normalize specifier version for prefix matching (:issue:`561`)
    * Improve documentation for ``packaging.specifiers`` and ``packaging.version``. (:issue:`572`)
    * ``Marker.evaluate`` will now assume evaluation environment with empty ``extra``.
      Evaluating markers like ``"extra == 'xyz'"`` without passing any extra in the
      ``environment`` will no longer raise an exception (:issue:`550`)
    * Remove dependency on ``pyparsing``, by replacing it with a hand-written parser.
      This package now has no runtime dependencies (:issue:`468`)
    * Update return type hint for ``Specifier.filter`` and ``SpecifierSet.filter``
      to use ``Iterator`` instead of ``Iterable`` (:issue:`584`)
    
    Commits
    • b6e9bbc Bump for release
    • 55bdc66 Bump version to 22.0
    • b997a48 Permit arbitrary whitespace around versions specifier in parenthesis
    • e7ce051 Fix a typo in an error message
    • cb09331 Enforce word boundaries in operators and names
    • b41326d Rename marker_expr to marker
    • 975cd32 Permit whitespace around marker_atom
    • 8cba45c Add ParserSyntaxError as the cause of Invalid{Requirement/Marker}
    • 7930b73 Improve error message for bad version specifiers in Requirement
    • 258d252 Rewrite test suite for requirements parsing
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump paramiko from 2.11.0 to 2.12.0

    Bump paramiko from 2.11.0 to 2.12.0

    Bumps paramiko from 2.11.0 to 2.12.0.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump tldextract from 3.3.1 to 3.4.0

    Bump tldextract from 3.3.1 to 3.4.0

    Bumps tldextract from 3.3.1 to 3.4.0.

    Changelog

    Sourced from tldextract's changelog.

    3.4.0 (2022-10-04)

    • Features
      • Add method extract_urllib to extract from a urllib.parse.{ParseResult,SplitResult} (#274)
    • Bugfixes
      • Fix internal type-var error, in newer versions of mypy (#275)
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
Releases(0.10.6)
  • 0.10.6(Apr 7, 2022)

    Quite a few bug fixes and tiny enhancements for your smooth sailing.

    • Added: New commands section for Blueprints to run arbitrary commands via SSH
    • Added: New --json flag for sail regions, added some colors
    • Added: New --json flag for sail sizes and improved output
    • Added: New --json flog for sail init and sail destroy, along with some util updates
    • Added: ClientAliveInterval setting for sshd to keep SSH sessions running
    • Fixed: Bug in sail db import which didn't allow the database import to complete
    • Fixed: Renewals of certs in Certbot should trigger Nginx reload
    • Fixed: Avoid dots in generated cron.d filenames as run-parts does not run them
    • Fixed: Python error when running sail profile curl, also ignore case on X-Sail-Profile search
    • Changed: Update xhprof PHP module for better closure support
    • Changed: Bumped minimum Python version to 3.8 in install script, added support for python3.8 binary
    • Changed: Removed PrettyTable dependency
    • Changed: Updated dependencies: paramiko, jinja2, fabric, click
    • Changed: Better error messages in Rsync when key permissions are too open
    • Changed: More verbose output for piped SSH commands when running in debug mode
    Source code(tar.gz)
    Source code(zip)
  • 0.10.5(Feb 8, 2022)

    • Added: New sail sftp enable and sail sftp disable commands to enable/disable SFTP (SSH, scp, rsync, etc.) access for www-data
    • Added: New files section support for blueprints
    • Added: New --json flag for sail domain list
    • Added: Enabled the MySQL slow query log for new provisions, view with sail logs --mysql
    • Added: php-intl package to cloud-config.yaml
    • Changed: Deny public access to wp-content/debug.log in default Nginx config
    • Changed: Add logrotate configuration for wp-content/debug.log
    • Changed: Don't allow sail destroy on applications with user domains
    • Fixed: Prime the WordPress environment after running a default blueprint at init
    • Fixed: Postfix permissions (again) causing some configurations to error with permission denied in main.cf
    Source code(tar.gz)
    Source code(zip)
  • 0.10.4(Jan 14, 2022)

    • Added: New sail rebuild command to re-provision a fresh environment on the same host
    • Added: New sail db reset-password command to reset the database credentials and update wp-config.php
    • Added: A sail db import will attempt an atomic import via a temporary table, will fix non-standard table prefixes, use --partial to override
    • Changed: Set the WordPress admin_user to the first part of the provided e-mail, to prevent leaking the full e-mail address
    • Changed: Removed syslog configuration from Nginx for better performance
    • Changed: Updated sail logs to work with default Nginx access/error logs in addition to journald
    • Changed: Added worker_rlimit_nofile to Nginx to allow more open files
    • Changed: Default --lines in sail logs will now read terminal height
    • Fixed: Nginx warning on duplicate mime type declaration for font/woff
    Source code(tar.gz)
    Source code(zip)
  • 0.10.3(Dec 27, 2021)

    Hey all!

    Quite a few updates this time, most notably the new default.yaml blueprint which will now be used with every sail init. This adds the Surge page caching plugin, and a fail2ban configuration to prevent password bruteforce attacks on SSH and WordPress. If you'd like to disable this behavior and provision an empty install instead, you can pass your own --blueprint to sail init, or --blueprint=none to provision without any BP at all.

    We've also added some colors and improved the output format. Tested on various terminals and color schemes, but if you bump into any contrast and readability issues, please don't hesitate to open a new issue.

    A few Premium features added with this release as well. You can learn more about Sail Premium here.

    Changelog:

    • Added: A default.yaml blueprint, with Surge cache and fail2ban pre-insalled
    • Added: Quite a few colors to most of the Sail commands, better output formatting, output utils
    • Changed: Increased default upload/post max size from 2/8M to 128M in PHP
    • Changed: Increased client_max_body_size from 32M to 128M in Nginx
    • Changed: sail backup is now an alias to sail backup create, sail restore is an alias to sail backup restore
    • Changed: Added a quiet argument to ssh key add to suppress output
    • Changed: Updated various dependencies
    • Changed: Better error handling in install.sh
    • Changed: Cleaned README.md, moved remaining tutorials to the knowledgebase
    • Fixed: Installer will no longer fail silently on missing python3-venv module
    • Fixed: Error in postfix unable to read the main.cf configuration file

    Premium features:

    • Added: Managed backups sail backup (automatic daily and on-demand)
    • Added: Uptime and health monitoring sail monitor with e-mail/SMS alerts
    • Added: Image optimization and WebP

    Happy holidays!

    Source code(tar.gz)
    Source code(zip)
  • 0.10.3-beta2(Dec 22, 2021)

    All of the premium stuff merged, quite a few design changes. Back on the mainline branch now too.

    If you'd like to help test the premium features, ask for a key in Slack.

    Source code(tar.gz)
    Source code(zip)
  • 0.10.3-beta1(Dec 20, 2021)

    Work around premium features primarily: image optimization, managed backups, monitoring.

    Let us know on Slack if you would like to help test them out and we'll be happy to grant you a license key.

    Source code(tar.gz)
    Source code(zip)
  • 0.10.2(Dec 13, 2021)

    A few minor fixes and quality-of-life improvements in this release:

    • Added: New sail cron commands to add, remove and view system cron entries
    • Added: Default fastcgi_cache configuration, compatible with most advanced-cache.php-based caching plugins
    • Added: A --json flag to the sail db export command for easier integration with third-party scripts
    • Changed: Update xhprof.so for profiling, adds labels to do_shortcode_tag
    • Changed: Nginx server configuration template now adds http2 support by default
    • Changed: Increased various timeouts in init
    • Changed: .ico requests can now be served by PHP/WordPress
    • Fixed: ufw now properly configured during provision
    • Fixed: Redirects in sail profile will no longer be followed
    Source code(tar.gz)
    Source code(zip)
  • 0.10.1(Nov 19, 2021)

    Some minor work around domains/DNS and support for .deployignore (docs here).

    • Changed: Postfix and postfix-related blueprints now support namespaces under the hood
    • Changed: sail destroy will now delete DNS records for all associated domains, use --skip-dns to bypass
    • Changed: sail domain delete will no longer delete orphaned subdomains when given a parent domain
    • Changed: sail domain delete will now attempt to delete the DNS zone only if no more records exist in that zone
    • Changed: sail domain delete now accepts a --zone flag which forces a DNS zone delete (and orphaned subdomains form config.json)
    • Added: Support for the Mailgun EU region in mailgun.yaml blueprint
    • Added: Support for a .deployignore file to remove certain patters from deployment
    Source code(tar.gz)
    Source code(zip)
  • 0.10.0(Nov 10, 2021)

    What's new?

    Environments and namespaces are here! These allow users to deploy and work with multiple WordPress applications, sharing the same environment. Please refer to our namespaces and environments guide for usage information.

    We've also overhauled a lot of the existing routines in Sail CLI, making them fully client-side, so you no longer have to rely on (or share secrets with) our API service. The only remaining thing powered by the API service is the DNS management for the internal .justsailed.io subdomains.

    Note: This release contains breaking changes. If you have existing Sail projects, please refer to the upgrade notes at the end of the announcement.

    Changelog

    • Added: Namespaces and environments to run multiple applications in the same environment. Use --namespace and --environment with init.
    • Added: New pre-deploy hooks in .sail, these will run every time deploy is invoked
    • Added: New sail diff command, shortcut for sail deploy --dry-run and sail download --dry-run
    • Added: A new install.sh script to install and update Sail CLI
    • Changed: New --skip-hooks or --no-verify options to sail deploy to skip running hooks
    • Changed: Blueprints now fully client-side
    • Changed: Provision and destroy are mostly client-side (API calls only to control justsailed.io DNS)
    • Changed: Sizes and regions now client-side
    • Changed: Domains, primary and HTTPS fully client-side, domains settings in .sail/config.json
    • Changed: Provision now uses cloud-config instead of a Docker image, removed --host option from ssh commands

    Migrating 0.9.x projects to 0.10.0

    If you have an existing 0.9.x project, don't rush to upgrade your Sail CLI yet. If you did, don't worry, you can install any version you like using our new installer.

    • Go to your existing 0.9.x project, and run sail backup to perform a full site backup
    • Run sail domain list and note down the list of all domains associated with your project
    • Backup any custom configs/hacks/etc. you might have made on the 0.9.x server
    • Upgrade Sail CLI to 0.10.x using any of the install methods
    • Create a new directory for your project and run sail init
    • Copy the new wp-config.php to a safe place, this will contain new database credentials
    • Restore the backup from step 1: sail restore /path/to/old/project/.backups/backup-filename.tar.gz
    • After the restore is successful, run sail download to make sure your local copy in fresh
    • Update wp-config.php with the database credentials you stored in a safe place
    • Deploy the new wp-config.php and verify that it's working: sail wp option get home
    • Add your domains to the new project sail domain add
    • Set the primary domain with sail domain make-primary example.org --no-replace
    • After the DNS changes have propagated, you can request new SSL certificates for the domains with sail domain make-https example.org www.example.org

    After your site has been successfully migrated and is live, you can shutdown the old 0.9.x project with sail destroy.

    If you need any assistance with migrating existing projects to this new release, please join the #help channel on our Slack community and we'll be happy to help you out!

    Source code(tar.gz)
    Source code(zip)
  • 0.9.18(Oct 26, 2021)

    Some housekeeping.

    • Added: New sail ssh run command
    • Added: New apt section for blueprints
    • Added: New site-verification.yaml blueprint to add TXT records
    • Changed: Deploys, rollbacks and release-tracking are now 100% client-side
    • Changed: Split --host and --root arguments for sail ssh shell
    • Changed: Use Fabric instead of SSH subprocess in db and full backups
    • Changed: Some overall refactoring
    Source code(tar.gz)
    Source code(zip)
  • 0.9.17(Oct 13, 2021)

    • Added: New sail ssh key group of commands to list, add and delete SSH keys
    • Added: sail info command to show some basic project information
    • Change: Add a default 1G swap file for new provisions
    • Fixed: Rsync/SSH not working on project paths with spaces
    Source code(tar.gz)
    Source code(zip)
  • 0.9.16(Oct 7, 2021)

    • Added: New profile clean command to delete local and remove profiling data
    • Added: php-xml and php-zip packages to the core image
    • Added: Support for the newer justsailed.io internal subdomains
    • Fixed: When deleting a parent domain orphaned subdomains were not deleted
    • Fixed: Poor performance navigating the profile browser with > 5k entries
    Source code(tar.gz)
    Source code(zip)
  • 0.9.15(Oct 5, 2021)

    Profiling is here!

    • Added: New profile command group for performance profiling
    • Added: New gmail-dns.yaml blueprint to add Google Mail / Workspace MX records
    • Changed: Remove associated sailed.io DNS record on destroy
    Source code(tar.gz)
    Source code(zip)
  • 0.9.14(Sep 23, 2021)

    • Added: New mailgun.yaml and mailgun-dns.yaml blueprints to deploy a working Mailgun configuration
    • Added: New postfix blueprint component and postfix.yaml default BP
    • Added: New fail2ban blueprint component and fail2ban.yaml default BP
    • Added: A new type attribute to vars in blueprints, supports bool, int, float, str
    • Added: New --postfix or --mail flags to sail logs to query postfix items in syslog
    • Added: New dns blueprint component to add DNS records to your application domains
    • Fixed: Plugin activation error when no custom plugins specified
    • Fixed: Theme activation mismatch in blueprints, when custom theme above wporg themes
    Source code(tar.gz)
    Source code(zip)
  • 0.9.13(Sep 17, 2021)

    • Added: Blueprints are here! sail blueprint path/to/blueprint.yaml to apply
    • Added: End-to-end tests around blueprints, tweaked testing a bit, added GitHub workflows to run tests on push/PR
    • Changed: Fixed system journal requiring a restart for sail logs to work
    • Changed: Fixed .com.br and .com.tr now treated as TLDs when working with domains
    • Changed: Make sure new Droplet is assigned an actual IP address prior to using it
    • Changed: Updated readme to reflect BPs, added push-to-deploy links
    Source code(tar.gz)
    Source code(zip)
  • 0.9.12(Sep 12, 2021)

    • Added: New --skip-dns flag for domain add and domain delete which skips making any DNS changes
    • Added: Long-awaited sail restore command, to restore complete site backups to production
    • Added: New --skip-replace argument for domain make-primary, to skip the search-replace ops
    • Added: Sparse deploys via an optional path argument for deploy, to specify one or more subtrees to process
    • Added: Sparse downloads, similar to deploys with optional path argument for download
    • Changed: deploy now prepares the new release directory with a copy from the live release
    • Changed: Added a new util.rsync() function to standardize usage across all commands
    • Changed: End-to-end test now includes multiple scenarios for deploy and download routines
    • Changed: Slight refactoring, regrouping of commands, simpler ones went to a new misc.py instead of their own files
    • Removed: --delete argument from deploy since it was not really implemented (in a correct way) anyway
    Source code(tar.gz)
    Source code(zip)
  • 0.9.11(Sep 6, 2021)

    • Added: New destroy command to shutdown and delete a droplet
    • Added: First couple unit tests and a short end-to-end test
    • Added: New --dry-run flag for deploy and download commands
    • Added: New db export and db import commands
    • Changed: Renamed mysql command to db group, shell with sail db cli now
    • Changed: Lots of moving files around and reorganizing code
    • Changed: Shorthand -v flag to display version
    • Changed: The backup command now uses a database export routine similar to db export
    Source code(tar.gz)
    Source code(zip)
    sailed.io-0.9.11-py3-none-any.whl(29.53 KB)
    sailed.io-0.9.11.tar.gz(16.68 KB)
Owner
Konstantin Kovshenin
Konstantin Kovshenin
Simple Discord bot for the Collectez community.

Harvey - Discord Bot Simple Discord bot for the Collectez community. Features Ping the current status of Collectez's Teztools node. Steal emojis from

delintkhaum 1 Dec 26, 2021
Reverse engineering multi-device WhatsApp Web.

whatsapp-web-multi-device-reveng In this repository, the research for reverse engineering multi-device WhatsApp Web takes place, see here for a descri

84 Jan 01, 2023
批量下载抖音无水印视频

版权说明 本项目fork自Johnserf-Seed TikTokDownload。目的是为了增加个性化的功能,若想体验更多完善的功能请支持原作者的项目。 免责声明 本代码仅用于学习,下载后请勿用于商业用途。 环境要求 请检查宿主机,是否安装了python环境,并且配置了环境变量 pytho

Zhiwu Mao 44 Dec 28, 2022
Terraform module to ship CloudTrail logs stored in a S3 bucket into a Kinesis stream for further processing and real-time analysis.

AWS infrastructure to ship CloudTrail logs from S3 to Kinesis This repository contains a Terraform module to ship CloudTrail logs stored in a S3 bucke

Nexthink 8 Sep 20, 2022
Chatbot with python code!

Chatbot Python Chatbot with python! How to Run Installation requirements. pip install -r requirements.txt Sample Chatbot The required files must be d

Mohammad Dori 3 Jul 15, 2022
A demo without 🚀 science, just simple UTXO spending logic.

Stuck TX Demo Docker container that runs 4 dogecoind to demonstrate "the stuck tx problem". Scenario A wallet sends out 3 transactions to a recipient

Patrick Lodder 2 Nov 16, 2021
Clubhouse API written in Python. Standalone client included. For reference and education purposes only.

clubhouse-py is originally developed for the sake of interoperability. Standalone client is also created with very basic features, including but not limited to the audio-chat

1.7k Jan 05, 2023
Bifrost C2. Open-source post-exploitation using Discord API

Bifrost Command and Control What's Bifrost? Bifrost is an open-source Discord BOT that works as Command and Control (C2). This C2 uses Discord API for

38 Dec 05, 2022
Python library for generating sequences with uniform stimulus history

Sampling Euler tours for uniform stimulus history Table of Contents About Examples Experiment 1 Experiment 2 Experiment 3 Experiment 4 Experiment 5 Co

5 Nov 11, 2021
send sms via grafana alert webhook

notifier fire alarm What does this project do: the aim of this project is to send alarm notification from grafana alert manager via kavenegar api. sta

Ali Soltani 4 Oct 20, 2021
A youtube videos or channels tag finder python module

A youtube videos or channels tag finder python module

Fayas Noushad 4 Dec 03, 2021
A discord bot that moderates your server!

Staff Bot para Discord O que é? É um bot que modera o seu servidor no Discord, apagando mensagens indesejadas que os usuários mandem! Como usar Primei

Isac Gonçalves Cunha 3 Oct 07, 2021
A simple Facebook Account generator, written in python (needs different Email so Accounts do not get banned)

FacebookAccountGenerator FAB is a Facebook-Account generating script, written in python Installation Use the package manager pip to install selenium p

MrOverload 7 Jan 05, 2023
A python api to get info on covid-19

A python api to get info on covid-19

roof 2 Sep 18, 2022
Discord-Lite - A light weight discord client written in Python, for developers, by developers.

Discord-Lite - A light weight discord client written in Python, for developers, by developers.

Sachit 142 Jan 07, 2023
Simple script to ban bots at Twitch chats using a text file as a source.

AUTOBAN 🇺🇸 English version Simple script to ban bots at Twitch chats using a text file as a source. How to use Windows Go to releases for further in

And Paiva 5 Feb 06, 2022
A supabase client for python

supabase-client A Supabase client for Python. This mirrors the design of supabase-js Full documentation: https://keosariel.github.io/2021/08/08/supaba

kenneth gabriel 11 Dec 19, 2022
Quickly edit your slack posts.

Lightning Edit Quickly edit your Slack posts. Heavily inspired by @KhushrajRathod's LightningDelete. Usage: Note: Before anything, be sure to head ove

Cole Wilson 14 Nov 19, 2021
A simple discord bot based on python

A simple discord bot based on python

SENPAI LEGEND 2 Jul 24, 2022
TeslaPy - A Python implementation based on unofficial documentation of the client side interface to the Tesla Motors Owner API

TeslaPy - A Python implementation based on unofficial documentation of the client side interface to the Tesla Motors Owner API, which provides functiona

Tim Dorssers 233 Dec 30, 2022