octopize.deploy_tool 2.3.0__tar.gz → 2.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/PKG-INFO +11 -11
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/README.md +10 -10
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/pyproject.toml +1 -1
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/__init__.py +1 -1
- octopize_deploy_tool-2.4.0/src/octopize_avatar_deploy/steps/email.py +264 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/input.yaml +1 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/input.yaml +1 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/input.yaml +1 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/input.yaml +1 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/prompt_help/input.yaml +1 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/resume_interrupted/input_first_run.yaml +1 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/save_config_with_existing/input.yaml +1 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/integration/test_cli_integration.py +40 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_email.py +152 -3
- octopize_deploy_tool-2.3.0/src/octopize_avatar_deploy/steps/email.py +0 -178
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/.gitignore +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/authentik_migration.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/cli.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/cli_test_harness.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/components.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/configure.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/defaults.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/deployment_mode.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/download_templates.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/generate_env.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/generate_env_paths.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/input_gatherer.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/output_spec.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/printer.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/public_url.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/state_manager.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/__init__.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/api_local_source.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/authentik.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/authentik_blueprint.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/base.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/component_selection.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/database.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/local_source.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/logging.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/nginx.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/required.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/service_urls.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/storage.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/target_environment.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/telemetry.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/steps/user.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/template_provisioning.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/.env.template +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/.template-version +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/_env_fragment_api.template +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/_env_fragment_infra.template +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/_env_fragment_web.template +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/api.env.template +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/compose.override.yaml.template +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/docker-compose.yml.template +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/nginx.conf.template +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/python_client.env.template +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/templates/web.env.template +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/topology_urls.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/url_contract.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/src/octopize_avatar_deploy/version_compat.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/TESTING.md +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/__init__.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/conftest.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/__init__.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/authentik_migration/licenses.csv +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/authentik_migration/organizations.csv +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/authentik_migration/users.csv +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/expected/.deployment-state.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/expected/.env +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/expected/docker-compose.yml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/expected/.deployment-state.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/expected/.env +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/expected/docker-compose.yml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_not_found/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_first/expected/.deployment-state.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_first/expected/.env +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_first/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_first/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_first/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_first/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_first/expected/deployment-config.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_first/expected/docker-compose.yml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_first/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_second/expected/.deployment-state.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_second/expected/.env +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_second/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_second/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_second/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_second/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_second/expected/docker-compose.yml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/config_round_trip_second/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/deploy_help/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/.deployment-state.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/.env +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/compose.override.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/docker-compose.yml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/test-.npmrc +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/test-avatar-repo/services/api/main.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/expected/test-avatar-website/package.json +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/dev_mode_deployment/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/generate_env_help/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/generate_env_output_dir_error/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/help/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/invalid_port_config/config.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/invalid_port_config/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/invalid_url_config/config.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/invalid_url_config/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/malformed_yaml/config.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/malformed_yaml/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/missing_subcommand/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/expected/.deployment-state.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/expected/.env +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/expected/docker-compose.yml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/config.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/expected/.deployment-state.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/expected/.env +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/expected/docker-compose.yml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_complete/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_incomplete_config/config.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_incomplete_config/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_no_config/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_partial_config/config.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/non_interactive_partial_config/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/output_dir_nested/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/output_dir_permission_denied/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/prompt_help/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/resume_interrupted/first_run/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/resume_interrupted/input_resume.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/resume_interrupted/resume/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/save_config_interactive/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/save_config_with_existing/config.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/save_config_with_existing/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/template_from_local_verbose/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/type_mismatch_config/config.yaml +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/type_mismatch_config/output.txt +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/integration/__init__.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/integration/test_generate_env.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_api_local_source.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_authentik.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_authentik_blueprint.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_base.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_component_selection.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_database.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_local_source.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_logging.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_nginx.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_required.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_service_urls.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_state_manager.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_storage.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_target_environment.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_telemetry.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_user.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/steps/test_user_validation.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/test_cli_harness.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_authentik_client.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_authentik_migration.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_compare_helpers.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_components.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_deployment_configurator.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_deployment_runner.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_generate_env_cli.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_generic_prompt.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_input_gatherer.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_output_spec.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_printer.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_public_url.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_rich_implementations.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_step_filtering.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_topology_urls.py +0 -0
- {octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/unit/test_version_validation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: octopize.deploy_tool
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.0
|
|
4
4
|
Summary: Deployment configuration tool for Octopize Avatar platform
|
|
5
5
|
Project-URL: Homepage, https://octopize.io
|
|
6
6
|
Project-URL: Documentation, https://docs.octopize.io/docs/deploying/self-hosted
|
|
@@ -56,7 +56,7 @@ curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
|
56
56
|
Then run any command directly:
|
|
57
57
|
|
|
58
58
|
```bash
|
|
59
|
-
uvx octopize-deploy-tool deploy --output-dir
|
|
59
|
+
uvx octopize-deploy-tool deploy --output-dir ./app/avatar
|
|
60
60
|
```
|
|
61
61
|
|
|
62
62
|
### Option 2 — virtual environment
|
|
@@ -68,7 +68,7 @@ Modern Linux distributions and macOS prevent installing packages into the system
|
|
|
68
68
|
python -m venv .venv
|
|
69
69
|
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
70
70
|
pip install octopize-deploy-tool
|
|
71
|
-
octopize-deploy-tool deploy --output-dir
|
|
71
|
+
octopize-deploy-tool deploy --output-dir ./app/avatar
|
|
72
72
|
```
|
|
73
73
|
|
|
74
74
|
### Option 3 — global pip
|
|
@@ -121,13 +121,13 @@ docker run --rm \
|
|
|
121
121
|
Generate a Docker deployment configuration interactively:
|
|
122
122
|
|
|
123
123
|
```bash
|
|
124
|
-
octopize-deploy-tool deploy --output-dir
|
|
124
|
+
octopize-deploy-tool deploy --output-dir ./app/avatar
|
|
125
125
|
```
|
|
126
126
|
|
|
127
127
|
Then start the deployment:
|
|
128
128
|
|
|
129
129
|
```bash
|
|
130
|
-
cd
|
|
130
|
+
cd ./app/avatar
|
|
131
131
|
docker compose down --volumes --remove-orphans
|
|
132
132
|
docker compose up -d
|
|
133
133
|
```
|
|
@@ -155,7 +155,7 @@ Use `deploy` to generate a full Docker Compose deployment.
|
|
|
155
155
|
Example:
|
|
156
156
|
|
|
157
157
|
```bash
|
|
158
|
-
octopize-deploy-tool deploy --output-dir
|
|
158
|
+
octopize-deploy-tool deploy --output-dir ./app/avatar
|
|
159
159
|
```
|
|
160
160
|
|
|
161
161
|
Common `deploy` options:
|
|
@@ -217,7 +217,7 @@ Then run:
|
|
|
217
217
|
|
|
218
218
|
```bash
|
|
219
219
|
octopize-deploy-tool deploy \
|
|
220
|
-
--output-dir
|
|
220
|
+
--output-dir ./app/avatar \
|
|
221
221
|
--config config.yaml \
|
|
222
222
|
--non-interactive
|
|
223
223
|
```
|
|
@@ -227,7 +227,7 @@ octopize-deploy-tool deploy \
|
|
|
227
227
|
The `deploy` command typically writes:
|
|
228
228
|
|
|
229
229
|
```text
|
|
230
|
-
|
|
230
|
+
./app/avatar/
|
|
231
231
|
├── .env
|
|
232
232
|
├── docker-compose.yml
|
|
233
233
|
├── nginx/nginx.conf
|
|
@@ -252,13 +252,13 @@ for example:
|
|
|
252
252
|
1. Generate configuration:
|
|
253
253
|
|
|
254
254
|
```bash
|
|
255
|
-
octopize-deploy-tool deploy --output-dir
|
|
255
|
+
octopize-deploy-tool deploy --output-dir ./app/avatar
|
|
256
256
|
```
|
|
257
257
|
|
|
258
258
|
2. Review the generated files:
|
|
259
259
|
|
|
260
260
|
```bash
|
|
261
|
-
cd
|
|
261
|
+
cd ./app/avatar
|
|
262
262
|
cat .env
|
|
263
263
|
ls -la .secrets/
|
|
264
264
|
```
|
|
@@ -285,7 +285,7 @@ for example:
|
|
|
285
285
|
Retry with verbose output:
|
|
286
286
|
|
|
287
287
|
```bash
|
|
288
|
-
octopize-deploy-tool deploy --output-dir
|
|
288
|
+
octopize-deploy-tool deploy --output-dir ./app/avatar --verbose
|
|
289
289
|
```
|
|
290
290
|
|
|
291
291
|
### Existing containers cause bind-mount or startup issues
|
|
@@ -25,7 +25,7 @@ curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
|
25
25
|
Then run any command directly:
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
uvx octopize-deploy-tool deploy --output-dir
|
|
28
|
+
uvx octopize-deploy-tool deploy --output-dir ./app/avatar
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
### Option 2 — virtual environment
|
|
@@ -37,7 +37,7 @@ Modern Linux distributions and macOS prevent installing packages into the system
|
|
|
37
37
|
python -m venv .venv
|
|
38
38
|
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
39
39
|
pip install octopize-deploy-tool
|
|
40
|
-
octopize-deploy-tool deploy --output-dir
|
|
40
|
+
octopize-deploy-tool deploy --output-dir ./app/avatar
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
### Option 3 — global pip
|
|
@@ -90,13 +90,13 @@ docker run --rm \
|
|
|
90
90
|
Generate a Docker deployment configuration interactively:
|
|
91
91
|
|
|
92
92
|
```bash
|
|
93
|
-
octopize-deploy-tool deploy --output-dir
|
|
93
|
+
octopize-deploy-tool deploy --output-dir ./app/avatar
|
|
94
94
|
```
|
|
95
95
|
|
|
96
96
|
Then start the deployment:
|
|
97
97
|
|
|
98
98
|
```bash
|
|
99
|
-
cd
|
|
99
|
+
cd ./app/avatar
|
|
100
100
|
docker compose down --volumes --remove-orphans
|
|
101
101
|
docker compose up -d
|
|
102
102
|
```
|
|
@@ -124,7 +124,7 @@ Use `deploy` to generate a full Docker Compose deployment.
|
|
|
124
124
|
Example:
|
|
125
125
|
|
|
126
126
|
```bash
|
|
127
|
-
octopize-deploy-tool deploy --output-dir
|
|
127
|
+
octopize-deploy-tool deploy --output-dir ./app/avatar
|
|
128
128
|
```
|
|
129
129
|
|
|
130
130
|
Common `deploy` options:
|
|
@@ -186,7 +186,7 @@ Then run:
|
|
|
186
186
|
|
|
187
187
|
```bash
|
|
188
188
|
octopize-deploy-tool deploy \
|
|
189
|
-
--output-dir
|
|
189
|
+
--output-dir ./app/avatar \
|
|
190
190
|
--config config.yaml \
|
|
191
191
|
--non-interactive
|
|
192
192
|
```
|
|
@@ -196,7 +196,7 @@ octopize-deploy-tool deploy \
|
|
|
196
196
|
The `deploy` command typically writes:
|
|
197
197
|
|
|
198
198
|
```text
|
|
199
|
-
|
|
199
|
+
./app/avatar/
|
|
200
200
|
├── .env
|
|
201
201
|
├── docker-compose.yml
|
|
202
202
|
├── nginx/nginx.conf
|
|
@@ -221,13 +221,13 @@ for example:
|
|
|
221
221
|
1. Generate configuration:
|
|
222
222
|
|
|
223
223
|
```bash
|
|
224
|
-
octopize-deploy-tool deploy --output-dir
|
|
224
|
+
octopize-deploy-tool deploy --output-dir ./app/avatar
|
|
225
225
|
```
|
|
226
226
|
|
|
227
227
|
2. Review the generated files:
|
|
228
228
|
|
|
229
229
|
```bash
|
|
230
|
-
cd
|
|
230
|
+
cd ./app/avatar
|
|
231
231
|
cat .env
|
|
232
232
|
ls -la .secrets/
|
|
233
233
|
```
|
|
@@ -254,7 +254,7 @@ for example:
|
|
|
254
254
|
Retry with verbose output:
|
|
255
255
|
|
|
256
256
|
```bash
|
|
257
|
-
octopize-deploy-tool deploy --output-dir
|
|
257
|
+
octopize-deploy-tool deploy --output-dir ./app/avatar --verbose
|
|
258
258
|
```
|
|
259
259
|
|
|
260
260
|
### Existing containers cause bind-mount or startup issues
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"""Email configuration step."""
|
|
2
|
+
|
|
3
|
+
import ipaddress
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from .base import (
|
|
7
|
+
DefaultKey,
|
|
8
|
+
DeploymentStep,
|
|
9
|
+
PromptConfig,
|
|
10
|
+
ValidationError,
|
|
11
|
+
ValidationSuccess,
|
|
12
|
+
parse_str,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
# AWS SES SMTP preset – connection settings provided by Octopize.
|
|
16
|
+
# Operators only need to supply the SMTP username and password.
|
|
17
|
+
AWS_SMTP_HOST = "email-smtp.eu-west-3.amazonaws.com"
|
|
18
|
+
AWS_SMTP_PORT = "587"
|
|
19
|
+
AWS_SMTP_USE_TLS = "false"
|
|
20
|
+
AWS_SMTP_START_TLS = "true"
|
|
21
|
+
AWS_SMTP_VERIFY = "true"
|
|
22
|
+
AWS_SMTP_SENDER_EMAIL = "noreply@octopize.io"
|
|
23
|
+
|
|
24
|
+
_AWS_SMTP_HELP = (
|
|
25
|
+
"Choose 'yes' if Octopize provided you with AWS SES SMTP credentials.\n"
|
|
26
|
+
"The tool will prefill the standard host, port, and TLS settings automatically;\n"
|
|
27
|
+
"you will only be asked for the SMTP username and password.\n"
|
|
28
|
+
"\n"
|
|
29
|
+
"Choose 'no' to enter all SMTP connection details manually (any provider)."
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def validate_smtp_host(value: str) -> ValidationSuccess[str] | ValidationError:
|
|
34
|
+
"""
|
|
35
|
+
Validate that the SMTP host is a hostname or domain name, not a raw IP address.
|
|
36
|
+
|
|
37
|
+
An empty value is allowed (it means SMTP is not yet configured).
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
value: The SMTP host value to validate
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
ValidationSuccess with the host string, or ValidationError with a message
|
|
44
|
+
"""
|
|
45
|
+
host = str(value).strip()
|
|
46
|
+
|
|
47
|
+
if not host:
|
|
48
|
+
# Empty is allowed — the operator can leave SMTP unconfigured
|
|
49
|
+
return ValidationSuccess(host)
|
|
50
|
+
|
|
51
|
+
# Reject raw IP addresses (both IPv4 and IPv6)
|
|
52
|
+
try:
|
|
53
|
+
ipaddress.ip_address(host)
|
|
54
|
+
return ValidationError(
|
|
55
|
+
f"'{host}' is a raw IP address. "
|
|
56
|
+
"SMTP_HOST must be a hostname or domain name, not an IP address. "
|
|
57
|
+
"Examples: 'smtp.example.com', 'smtp.sendgrid.net', 'mail.example.com'."
|
|
58
|
+
)
|
|
59
|
+
except ValueError:
|
|
60
|
+
pass
|
|
61
|
+
|
|
62
|
+
return ValidationSuccess(host)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class EmailStep(DeploymentStep):
|
|
66
|
+
"""Handles email configuration and credentials."""
|
|
67
|
+
|
|
68
|
+
name = "email"
|
|
69
|
+
description = "Configure SMTP email settings and credentials"
|
|
70
|
+
|
|
71
|
+
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
|
72
|
+
super().__init__(*args, **kwargs)
|
|
73
|
+
# Initialised here so generate_secrets() can always reference the attribute
|
|
74
|
+
# without needing getattr(); updated by collect_config() once the operator answers.
|
|
75
|
+
self._use_aws_preset: bool = False
|
|
76
|
+
|
|
77
|
+
def collect_config(self) -> dict[str, Any]:
|
|
78
|
+
"""Collect email configuration."""
|
|
79
|
+
config = {}
|
|
80
|
+
|
|
81
|
+
print("\n--- Email Configuration ---")
|
|
82
|
+
self.printer.print(
|
|
83
|
+
"This section configures how the deployment sends outbound emails, mainly "
|
|
84
|
+
"for Authentik account and password workflows.\n"
|
|
85
|
+
"\n"
|
|
86
|
+
"The deployment needs an SMTP server to send emails such as account setup, "
|
|
87
|
+
"password reset, and other authentication-related messages.\n"
|
|
88
|
+
"\n"
|
|
89
|
+
"You can use:\n"
|
|
90
|
+
" - your own SMTP provider or mail server\n"
|
|
91
|
+
" - an SMTP service provided by Octopize, based on AWS\n"
|
|
92
|
+
"\n"
|
|
93
|
+
"If Octopize provides the SMTP service, we will give you the SMTP "
|
|
94
|
+
"credentials. In that case, the tool could eventually prefill the standard "
|
|
95
|
+
"connection settings and only ask you for the username and password we "
|
|
96
|
+
"provide."
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
use_aws = self._resolve_use_aws_smtp()
|
|
100
|
+
|
|
101
|
+
# Store as instance variable so generate_secrets() can check it without
|
|
102
|
+
# persisting the flag to deployment-config.yaml.
|
|
103
|
+
self._use_aws_preset = use_aws
|
|
104
|
+
|
|
105
|
+
if use_aws:
|
|
106
|
+
config["SMTP_HOST"] = AWS_SMTP_HOST
|
|
107
|
+
config["SMTP_PORT"] = AWS_SMTP_PORT
|
|
108
|
+
config["SMTP_USE_TLS"] = AWS_SMTP_USE_TLS
|
|
109
|
+
config["SMTP_START_TLS"] = AWS_SMTP_START_TLS
|
|
110
|
+
config["SMTP_VERIFY"] = AWS_SMTP_VERIFY
|
|
111
|
+
config["SMTP_SENDER_EMAIL"] = AWS_SMTP_SENDER_EMAIL
|
|
112
|
+
else:
|
|
113
|
+
# Manual SMTP configuration
|
|
114
|
+
config["SMTP_HOST"] = self.get_config_or_prompt_generic(
|
|
115
|
+
PromptConfig(
|
|
116
|
+
config_key="SMTP_HOST",
|
|
117
|
+
prompt_message="SMTP host",
|
|
118
|
+
default_value=self.get_default_value("email.smtp.host"),
|
|
119
|
+
prompt_key="email.smtp_host",
|
|
120
|
+
parse_and_validate=validate_smtp_host,
|
|
121
|
+
help_text=(
|
|
122
|
+
"Hostname of the outbound SMTP server used to send emails from the "
|
|
123
|
+
"deployment.\n"
|
|
124
|
+
"\n"
|
|
125
|
+
"Use a mail server hostname or domain name, for example:\n"
|
|
126
|
+
" - smtp.gmail.com\n"
|
|
127
|
+
" - smtp.sendgrid.net\n"
|
|
128
|
+
" - mail.example.com\n"
|
|
129
|
+
"\n"
|
|
130
|
+
"Do not use an IP address here.\n"
|
|
131
|
+
"\n"
|
|
132
|
+
"This SMTP server is used by Authentik to send emails such as account "
|
|
133
|
+
"setup and password reset messages."
|
|
134
|
+
),
|
|
135
|
+
)
|
|
136
|
+
)
|
|
137
|
+
config["SMTP_PORT"] = self.get_config_or_prompt_generic(
|
|
138
|
+
PromptConfig(
|
|
139
|
+
config_key="SMTP_PORT",
|
|
140
|
+
prompt_message="SMTP port",
|
|
141
|
+
default_value=self.get_default_value("email.smtp.port"),
|
|
142
|
+
prompt_key="email.smtp_port",
|
|
143
|
+
parse_and_validate=parse_str,
|
|
144
|
+
help_text=(
|
|
145
|
+
"TCP port for the SMTP connection.\n"
|
|
146
|
+
"Common values:\n"
|
|
147
|
+
" 587 — STARTTLS (recommended)\n"
|
|
148
|
+
" 465 — TLS/SSL\n"
|
|
149
|
+
" 25 — plain SMTP (often blocked by ISPs)"
|
|
150
|
+
),
|
|
151
|
+
)
|
|
152
|
+
)
|
|
153
|
+
config["SMTP_USE_TLS"] = self.get_config(
|
|
154
|
+
"SMTP_USE_TLS", DefaultKey("email.smtp.use_tls")
|
|
155
|
+
)
|
|
156
|
+
config["SMTP_START_TLS"] = self.get_config(
|
|
157
|
+
"SMTP_START_TLS", DefaultKey("email.smtp.start_tls")
|
|
158
|
+
)
|
|
159
|
+
config["SMTP_VERIFY"] = self.get_config("SMTP_VERIFY", DefaultKey("email.smtp.verify"))
|
|
160
|
+
config["SMTP_SENDER_EMAIL"] = self.get_config_or_prompt_generic(
|
|
161
|
+
PromptConfig(
|
|
162
|
+
config_key="SMTP_SENDER_EMAIL",
|
|
163
|
+
prompt_message="SMTP sender email",
|
|
164
|
+
default_value=self.get_default_value("email.smtp.sender_email"),
|
|
165
|
+
prompt_key="email.smtp_sender_email",
|
|
166
|
+
help_text=(
|
|
167
|
+
"The From: address used for all outbound emails sent by the deployment.\n"
|
|
168
|
+
"\n"
|
|
169
|
+
"This address must be authorized to send through the configured SMTP "
|
|
170
|
+
"server.\n"
|
|
171
|
+
"\n"
|
|
172
|
+
"In most cases, you should keep the default or the value recommended for "
|
|
173
|
+
"your SMTP setup. Only change it if you have a specific need, for example "
|
|
174
|
+
"if your SMTP provider requires the sender address to be the same as the "
|
|
175
|
+
"SMTP username.\n"
|
|
176
|
+
"\n"
|
|
177
|
+
"Example:\n"
|
|
178
|
+
" - noreply@avatar.example.com"
|
|
179
|
+
),
|
|
180
|
+
)
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
# Username prompt: required for AWS in interactive mode, optional otherwise.
|
|
184
|
+
if use_aws and self.interactive:
|
|
185
|
+
config["SMTP_USERNAME"] = self.prompt(
|
|
186
|
+
"SMTP username",
|
|
187
|
+
default=None, # Required — AWS SES credentials cannot have an empty username.
|
|
188
|
+
key="email.smtp_username",
|
|
189
|
+
help_text="Username provided by Octopize for AWS SES SMTP authentication.",
|
|
190
|
+
)
|
|
191
|
+
else:
|
|
192
|
+
config["SMTP_USERNAME"] = self.get_config_or_prompt_generic(
|
|
193
|
+
PromptConfig(
|
|
194
|
+
config_key="SMTP_USERNAME",
|
|
195
|
+
prompt_message="SMTP username",
|
|
196
|
+
default_value="",
|
|
197
|
+
prompt_key="email.smtp_username",
|
|
198
|
+
help_text=(
|
|
199
|
+
"Username provided by Octopize for AWS SES SMTP authentication."
|
|
200
|
+
if use_aws
|
|
201
|
+
else (
|
|
202
|
+
"Username for SMTP authentication. Leave blank if your server\n"
|
|
203
|
+
"does not require authentication."
|
|
204
|
+
)
|
|
205
|
+
),
|
|
206
|
+
)
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
self.config.update(config)
|
|
210
|
+
|
|
211
|
+
return config
|
|
212
|
+
|
|
213
|
+
def _resolve_use_aws_smtp(self) -> bool:
|
|
214
|
+
"""Determine whether to use the built-in AWS SMTP preset.
|
|
215
|
+
|
|
216
|
+
In interactive mode the operator is asked explicitly.
|
|
217
|
+
In non-interactive mode, the value is read from ``self.config``
|
|
218
|
+
(key ``USE_AWS_SMTP_PRESET``); it defaults to ``False`` so that
|
|
219
|
+
existing non-interactive deployments are unaffected.
|
|
220
|
+
"""
|
|
221
|
+
if self.interactive:
|
|
222
|
+
return self.prompt_yes_no(
|
|
223
|
+
"Use built-in AWS SMTP configuration (provided by Octopize)?",
|
|
224
|
+
default=False,
|
|
225
|
+
key="email.use_aws_smtp",
|
|
226
|
+
help_text=_AWS_SMTP_HELP,
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
raw = self.config.get("USE_AWS_SMTP_PRESET", False)
|
|
230
|
+
if isinstance(raw, bool):
|
|
231
|
+
return raw
|
|
232
|
+
return str(raw).lower() in ("true", "yes", "1", "on", "enabled")
|
|
233
|
+
|
|
234
|
+
def generate_secrets(self) -> dict[str, str]:
|
|
235
|
+
"""Generate email-related secrets."""
|
|
236
|
+
secrets_dict = {}
|
|
237
|
+
|
|
238
|
+
if self.interactive:
|
|
239
|
+
if self._use_aws_preset:
|
|
240
|
+
# Password is required for AWS SES — no skip option.
|
|
241
|
+
smtp_password = self.prompt(
|
|
242
|
+
"SMTP password",
|
|
243
|
+
default=None,
|
|
244
|
+
key="email.smtp_password",
|
|
245
|
+
help_text=(
|
|
246
|
+
"Password provided by Octopize for AWS SES SMTP authentication.\n"
|
|
247
|
+
"This value is stored as a generated secret, not in the main config file."
|
|
248
|
+
),
|
|
249
|
+
)
|
|
250
|
+
else:
|
|
251
|
+
smtp_password = self.prompt(
|
|
252
|
+
"SMTP password (press Enter to skip)",
|
|
253
|
+
default="",
|
|
254
|
+
key="email.smtp_password",
|
|
255
|
+
help_text=(
|
|
256
|
+
"Password for SMTP authentication.\n"
|
|
257
|
+
"\n"
|
|
258
|
+
"Leave blank if your SMTP server does not require a password."
|
|
259
|
+
),
|
|
260
|
+
)
|
|
261
|
+
if smtp_password:
|
|
262
|
+
secrets_dict["smtp_password"] = smtp_password
|
|
263
|
+
|
|
264
|
+
return secrets_dict
|
{octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/basic_deployment/input.yaml
RENAMED
|
@@ -6,6 +6,7 @@ responses:
|
|
|
6
6
|
nginx_tls.ssl_certificate_path: ''
|
|
7
7
|
nginx_tls.ssl_certificate_key_path: ''
|
|
8
8
|
authentik.bootstrap_email: admin@example.com
|
|
9
|
+
email.use_aws_smtp: false
|
|
9
10
|
email.smtp_host: smtp.example.com
|
|
10
11
|
email.smtp_port: '587'
|
|
11
12
|
email.smtp_sender_email: noreply@example.com
|
{octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/cloud_storage/input.yaml
RENAMED
|
@@ -6,6 +6,7 @@ responses:
|
|
|
6
6
|
nginx_tls.ssl_certificate_path: ''
|
|
7
7
|
nginx_tls.ssl_certificate_key_path: ''
|
|
8
8
|
authentik.bootstrap_email: admin@cloud.example.com
|
|
9
|
+
email.use_aws_smtp: false
|
|
9
10
|
email.smtp_host: smtp.cloud.com
|
|
10
11
|
email.smtp_port: '587'
|
|
11
12
|
email.smtp_sender_email: noreply@cloud.example.com
|
|
@@ -6,6 +6,7 @@ responses:
|
|
|
6
6
|
nginx_tls.ssl_certificate_path: ''
|
|
7
7
|
nginx_tls.ssl_certificate_key_path: ''
|
|
8
8
|
authentik.bootstrap_email: dev@example.com
|
|
9
|
+
email.use_aws_smtp: false
|
|
9
10
|
email.smtp_host: smtp.example.com
|
|
10
11
|
email.smtp_port: '587'
|
|
11
12
|
email.smtp_sender_email: dev@example.com
|
{octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/fixtures/no_telemetry/input.yaml
RENAMED
|
@@ -6,6 +6,7 @@ responses:
|
|
|
6
6
|
nginx_tls.ssl_certificate_path: ''
|
|
7
7
|
nginx_tls.ssl_certificate_key_path: ''
|
|
8
8
|
authentik.bootstrap_email: admin@internal.com
|
|
9
|
+
email.use_aws_smtp: false
|
|
9
10
|
email.smtp_host: smtp.internal.com
|
|
10
11
|
email.smtp_port: '587'
|
|
11
12
|
email.smtp_sender_email: noreply@internal.com
|
|
@@ -6,6 +6,7 @@ responses:
|
|
|
6
6
|
nginx_tls.ssl_certificate_path: smtp
|
|
7
7
|
nginx_tls.ssl_certificate_key_path: smtp.example.com
|
|
8
8
|
authentik.bootstrap_email: '587'
|
|
9
|
+
email.use_aws_smtp: false
|
|
9
10
|
email.smtp_host: smtp.example.com
|
|
10
11
|
email.smtp_port: '587'
|
|
11
12
|
email.smtp_sender_email: noreply@example.com
|
|
@@ -3,6 +3,7 @@ responses:
|
|
|
3
3
|
nginx_tls.ssl_certificate_path: ''
|
|
4
4
|
nginx_tls.ssl_certificate_key_path: ''
|
|
5
5
|
authentik.bootstrap_email: admin@existing.com
|
|
6
|
+
email.use_aws_smtp: false
|
|
6
7
|
email.smtp_host: smtp.existing.com
|
|
7
8
|
email.smtp_port: '587'
|
|
8
9
|
email.smtp_sender_email: noreply@existing.com
|
{octopize_deploy_tool-2.3.0 → octopize_deploy_tool-2.4.0}/tests/integration/test_cli_integration.py
RENAMED
|
@@ -373,6 +373,46 @@ class TestCLIDeploymentScenarios:
|
|
|
373
373
|
# Verify no Jinja2 placeholders remain
|
|
374
374
|
assert "{{ BLUEPRINT_" not in blueprint_content
|
|
375
375
|
|
|
376
|
+
def test_aws_smtp_preset_dialog_values(self, temp_deployment_dir, log_file):
|
|
377
|
+
"""End-to-end test: AWS SMTP preset populates all connection fields from constants."""
|
|
378
|
+
responses = {
|
|
379
|
+
**fixture_manager.load_input_fixture("basic_deployment"),
|
|
380
|
+
# Override email section: select the AWS preset, supply credentials.
|
|
381
|
+
"email.use_aws_smtp": True,
|
|
382
|
+
"email.smtp_username": "AKIAIOSFODNN7EXAMPLE",
|
|
383
|
+
"email.smtp_password": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
harness = _create_deploy_harness(
|
|
387
|
+
responses=responses,
|
|
388
|
+
output_dir=temp_deployment_dir,
|
|
389
|
+
log_file=log_file,
|
|
390
|
+
)
|
|
391
|
+
exit_code = harness.run()
|
|
392
|
+
|
|
393
|
+
assert exit_code == 0
|
|
394
|
+
|
|
395
|
+
# Verify generated deployment state reflects AWS preset constants.
|
|
396
|
+
state_file = temp_deployment_dir / ".deployment-state.yaml"
|
|
397
|
+
assert state_file.exists()
|
|
398
|
+
with open(state_file) as f:
|
|
399
|
+
state = yaml.safe_load(f)
|
|
400
|
+
|
|
401
|
+
config = state["config"]
|
|
402
|
+
assert config["SMTP_HOST"] == "email-smtp.eu-west-3.amazonaws.com"
|
|
403
|
+
assert config["SMTP_PORT"] == "587"
|
|
404
|
+
assert config["SMTP_USE_TLS"] == "false"
|
|
405
|
+
assert config["SMTP_START_TLS"] == "true"
|
|
406
|
+
assert config["SMTP_VERIFY"] == "true"
|
|
407
|
+
assert config["SMTP_SENDER_EMAIL"] == "noreply@octopize.io"
|
|
408
|
+
assert config["SMTP_USERNAME"] == "AKIAIOSFODNN7EXAMPLE"
|
|
409
|
+
|
|
410
|
+
# Password should be stored as a secret, not in the main config.
|
|
411
|
+
assert "SMTP_PASSWORD" not in config
|
|
412
|
+
smtp_secret = temp_deployment_dir / ".secrets" / "smtp_password"
|
|
413
|
+
assert smtp_secret.exists()
|
|
414
|
+
assert smtp_secret.read_text().strip() == "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
|
|
415
|
+
|
|
376
416
|
|
|
377
417
|
class TestCLINonInteractiveMode:
|
|
378
418
|
"""Test non-interactive mode."""
|