octopize.deploy_tool 2.2.0__tar.gz → 2.3.1__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.2.0 → octopize_deploy_tool-2.3.1}/PKG-INFO +11 -11
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/README.md +10 -10
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/pyproject.toml +1 -1
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/__init__.py +1 -1
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/defaults.yaml +1 -1
- octopize_deploy_tool-2.3.1/src/octopize_avatar_deploy/steps/authentik.py +92 -0
- octopize_deploy_tool-2.3.1/src/octopize_avatar_deploy/steps/email.py +178 -0
- octopize_deploy_tool-2.3.1/src/octopize_avatar_deploy/steps/nginx.py +188 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/steps/required.py +76 -11
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/steps/telemetry.py +33 -0
- {octopize_deploy_tool-2.2.0/tests/fixtures/config_round_trip_second → octopize_deploy_tool-2.3.1/tests/fixtures/basic_deployment}/expected/.deployment-state.yaml +4 -4
- {octopize_deploy_tool-2.2.0/tests/fixtures/config_round_trip_second → octopize_deploy_tool-2.3.1/tests/fixtures/basic_deployment}/expected/.env +6 -6
- octopize_deploy_tool-2.3.1/tests/fixtures/basic_deployment/output.txt +99 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/cloud_storage/expected/.deployment-state.yaml +4 -4
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/cloud_storage/expected/.env +6 -6
- octopize_deploy_tool-2.3.1/tests/fixtures/cloud_storage/output.txt +99 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_first/expected/.deployment-state.yaml +4 -4
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_first/expected/.env +6 -6
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_first/expected/deployment-config.yaml +4 -4
- {octopize_deploy_tool-2.2.0/tests/fixtures/basic_deployment → octopize_deploy_tool-2.3.1/tests/fixtures/config_round_trip_second}/expected/.deployment-state.yaml +4 -4
- {octopize_deploy_tool-2.2.0/tests/fixtures/basic_deployment → octopize_deploy_tool-2.3.1/tests/fixtures/config_round_trip_second}/expected/.env +6 -6
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/.deployment-state.yaml +10 -10
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/.env +6 -6
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/output.txt +42 -0
- octopize_deploy_tool-2.3.1/tests/fixtures/invalid_port_config/output.txt +100 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/no_telemetry/expected/.deployment-state.yaml +4 -4
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/no_telemetry/expected/.env +6 -6
- octopize_deploy_tool-2.3.1/tests/fixtures/no_telemetry/output.txt +99 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_complete/expected/.deployment-state.yaml +4 -4
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_complete/expected/.env +6 -6
- octopize_deploy_tool-2.3.1/tests/fixtures/non_interactive_complete/output.txt +100 -0
- octopize_deploy_tool-2.3.1/tests/fixtures/non_interactive_incomplete_config/output.txt +100 -0
- octopize_deploy_tool-2.3.1/tests/fixtures/non_interactive_partial_config/output.txt +100 -0
- octopize_deploy_tool-2.3.1/tests/fixtures/output_dir_nested/output.txt +99 -0
- octopize_deploy_tool-2.3.1/tests/fixtures/prompt_help/output.txt +167 -0
- octopize_deploy_tool-2.3.1/tests/fixtures/resume_interrupted/first_run/output.txt +55 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/resume_interrupted/resume/output.txt +12 -0
- octopize_deploy_tool-2.3.1/tests/fixtures/save_config_interactive/output.txt +101 -0
- octopize_deploy_tool-2.3.1/tests/fixtures/save_config_with_existing/output.txt +102 -0
- octopize_deploy_tool-2.3.1/tests/fixtures/type_mismatch_config/output.txt +100 -0
- octopize_deploy_tool-2.3.1/tests/steps/test_email.py +251 -0
- octopize_deploy_tool-2.3.1/tests/steps/test_nginx.py +131 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_required.py +31 -0
- octopize_deploy_tool-2.2.0/src/octopize_avatar_deploy/steps/authentik.py +0 -53
- octopize_deploy_tool-2.2.0/src/octopize_avatar_deploy/steps/email.py +0 -103
- octopize_deploy_tool-2.2.0/src/octopize_avatar_deploy/steps/nginx.py +0 -76
- octopize_deploy_tool-2.2.0/tests/fixtures/basic_deployment/output.txt +0 -57
- octopize_deploy_tool-2.2.0/tests/fixtures/cloud_storage/output.txt +0 -57
- octopize_deploy_tool-2.2.0/tests/fixtures/invalid_port_config/output.txt +0 -58
- octopize_deploy_tool-2.2.0/tests/fixtures/no_telemetry/output.txt +0 -57
- octopize_deploy_tool-2.2.0/tests/fixtures/non_interactive_complete/output.txt +0 -58
- octopize_deploy_tool-2.2.0/tests/fixtures/non_interactive_incomplete_config/output.txt +0 -58
- octopize_deploy_tool-2.2.0/tests/fixtures/non_interactive_partial_config/output.txt +0 -58
- octopize_deploy_tool-2.2.0/tests/fixtures/output_dir_nested/output.txt +0 -57
- octopize_deploy_tool-2.2.0/tests/fixtures/prompt_help/output.txt +0 -82
- octopize_deploy_tool-2.2.0/tests/fixtures/resume_interrupted/first_run/output.txt +0 -25
- octopize_deploy_tool-2.2.0/tests/fixtures/save_config_interactive/output.txt +0 -59
- octopize_deploy_tool-2.2.0/tests/fixtures/save_config_with_existing/output.txt +0 -60
- octopize_deploy_tool-2.2.0/tests/fixtures/type_mismatch_config/output.txt +0 -58
- octopize_deploy_tool-2.2.0/tests/steps/test_email.py +0 -130
- octopize_deploy_tool-2.2.0/tests/steps/test_nginx.py +0 -52
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/.gitignore +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/authentik_migration.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/cli.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/cli_test_harness.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/components.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/configure.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/deployment_mode.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/download_templates.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/generate_env.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/generate_env_paths.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/input_gatherer.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/output_spec.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/printer.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/public_url.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/state_manager.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/steps/__init__.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/steps/api_local_source.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/steps/authentik_blueprint.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/steps/base.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/steps/component_selection.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/steps/database.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/steps/local_source.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/steps/logging.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/steps/service_urls.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/steps/storage.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/steps/target_environment.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/steps/user.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/template_provisioning.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/.env.template +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/.template-version +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/_env_fragment_api.template +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/_env_fragment_infra.template +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/_env_fragment_web.template +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/api.env.template +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/compose.override.yaml.template +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/docker-compose.yml.template +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/nginx.conf.template +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/python_client.env.template +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/templates/web.env.template +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/topology_urls.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/url_contract.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/src/octopize_avatar_deploy/version_compat.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/TESTING.md +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/__init__.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/conftest.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/__init__.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/authentik_migration/licenses.csv +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/authentik_migration/organizations.csv +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/authentik_migration/users.csv +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/basic_deployment/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/basic_deployment/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/basic_deployment/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/basic_deployment/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/basic_deployment/expected/docker-compose.yml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/basic_deployment/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/basic_deployment/input.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/cloud_storage/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/cloud_storage/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/cloud_storage/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/cloud_storage/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/cloud_storage/expected/docker-compose.yml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/cloud_storage/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/cloud_storage/input.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_not_found/output.txt +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_first/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_first/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_first/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_first/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_first/expected/docker-compose.yml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_first/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_second/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_second/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_second/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_second/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_second/expected/docker-compose.yml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/config_round_trip_second/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/deploy_help/output.txt +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/compose.override.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/docker-compose.yml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/test-.npmrc +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/test-avatar-repo/services/api/main.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/expected/test-avatar-website/package.json +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/dev_mode_deployment/input.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/generate_env_help/output.txt +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/generate_env_output_dir_error/output.txt +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/help/output.txt +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/invalid_port_config/config.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/invalid_url_config/config.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/invalid_url_config/output.txt +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/malformed_yaml/config.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/malformed_yaml/output.txt +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/missing_subcommand/output.txt +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/no_telemetry/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/no_telemetry/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/no_telemetry/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/no_telemetry/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/no_telemetry/expected/docker-compose.yml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/no_telemetry/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/no_telemetry/input.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_complete/config.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_complete/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_complete/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_complete/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_complete/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_complete/expected/docker-compose.yml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_complete/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_incomplete_config/config.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_no_config/output.txt +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/non_interactive_partial_config/config.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/output_dir_permission_denied/output.txt +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/prompt_help/input.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/resume_interrupted/input_first_run.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/resume_interrupted/input_resume.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/save_config_with_existing/config.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/save_config_with_existing/input.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/template_from_local_verbose/output.txt +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/fixtures/type_mismatch_config/config.yaml +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/integration/__init__.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/integration/test_cli_integration.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/integration/test_generate_env.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_api_local_source.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_authentik.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_authentik_blueprint.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_base.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_component_selection.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_database.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_local_source.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_logging.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_service_urls.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_state_manager.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_storage.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_target_environment.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_telemetry.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_user.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/steps/test_user_validation.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/test_cli_harness.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/unit/test_authentik_client.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/unit/test_authentik_migration.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/unit/test_compare_helpers.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/unit/test_components.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/unit/test_deployment_configurator.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/unit/test_deployment_runner.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/unit/test_generate_env_cli.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/unit/test_generic_prompt.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/unit/test_input_gatherer.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/unit/test_output_spec.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/unit/test_printer.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/unit/test_public_url.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/unit/test_rich_implementations.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/unit/test_step_filtering.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/tests/unit/test_topology_urls.py +0 -0
- {octopize_deploy_tool-2.2.0 → octopize_deploy_tool-2.3.1}/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.3.1
|
|
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,92 @@
|
|
|
1
|
+
"""Authentik configuration step."""
|
|
2
|
+
|
|
3
|
+
import secrets
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from .base import DeploymentStep, PromptConfig
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class AuthentikStep(DeploymentStep):
|
|
10
|
+
"""Handles Authentik SSO configuration and credentials."""
|
|
11
|
+
|
|
12
|
+
name = "authentik"
|
|
13
|
+
description = "Configure Authentik SSO authentication credentials"
|
|
14
|
+
|
|
15
|
+
def collect_config(self) -> dict[str, Any]:
|
|
16
|
+
"""Collect Authentik configuration."""
|
|
17
|
+
config = {}
|
|
18
|
+
|
|
19
|
+
self.printer.print("\n--- Authentik Configuration ---")
|
|
20
|
+
self.printer.print(
|
|
21
|
+
"This section configures Authentik, the identity and access management "
|
|
22
|
+
"service bundled with the Avatar deployment.\n"
|
|
23
|
+
"\n"
|
|
24
|
+
"Authentik is used to:\n"
|
|
25
|
+
" - store and manage users\n"
|
|
26
|
+
" - handle authentication and permissions\n"
|
|
27
|
+
" - provide the login flow for Avatar\n"
|
|
28
|
+
" - optionally connect to an existing identity provider or directory "
|
|
29
|
+
"service\n"
|
|
30
|
+
"\n"
|
|
31
|
+
"Depending on your setup, Authentik can also be integrated with existing "
|
|
32
|
+
"user management and SSO systems such as Microsoft Entra ID, Active "
|
|
33
|
+
"Directory, and other external identity providers.\n"
|
|
34
|
+
"\n"
|
|
35
|
+
"Authentik documentation:\n"
|
|
36
|
+
"https://docs.goauthentik.io/"
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
# Authentik database name and user
|
|
40
|
+
# These are typically set to default values unless customized
|
|
41
|
+
authentik_db_name = self.get_config("AUTHENTIK_DATABASE_NAME", "authentik")
|
|
42
|
+
authentik_db_user = self.get_config("AUTHENTIK_DATABASE_USER", "authentik")
|
|
43
|
+
|
|
44
|
+
config["AUTHENTIK_DATABASE_NAME"] = authentik_db_name
|
|
45
|
+
config["AUTHENTIK_DATABASE_USER"] = authentik_db_user
|
|
46
|
+
|
|
47
|
+
# Bootstrap configuration for automated install (skip OOBE)
|
|
48
|
+
# Default email for akadmin user
|
|
49
|
+
authentik_bootstrap_email = self.get_config_or_prompt_generic(
|
|
50
|
+
PromptConfig(
|
|
51
|
+
config_key="AUTHENTIK_BOOTSTRAP_EMAIL",
|
|
52
|
+
prompt_message="Enter email address for Authentik admin user (akadmin)",
|
|
53
|
+
default_value="admin@example.com",
|
|
54
|
+
prompt_key="authentik.bootstrap_email",
|
|
55
|
+
help_text=(
|
|
56
|
+
"Email address of the initial Authentik administrator account created "
|
|
57
|
+
"during bootstrap.\n"
|
|
58
|
+
"\n"
|
|
59
|
+
"This user will have full administrative access to the Authentik "
|
|
60
|
+
"application. It can manage users, authentication flows, providers, "
|
|
61
|
+
"integrations, and permissions.\n"
|
|
62
|
+
"\n"
|
|
63
|
+
"You can create additional super-admin users later if needed.\n"
|
|
64
|
+
"\n"
|
|
65
|
+
"No signup email is sent to this bootstrap administrator during "
|
|
66
|
+
"installation. It is still recommended to use a real, reachable email "
|
|
67
|
+
"address for operational clarity and future account management, but this "
|
|
68
|
+
"is not strictly required.\n"
|
|
69
|
+
"\n"
|
|
70
|
+
"This email address can also be used to log in."
|
|
71
|
+
),
|
|
72
|
+
)
|
|
73
|
+
)
|
|
74
|
+
config["AUTHENTIK_BOOTSTRAP_EMAIL"] = authentik_bootstrap_email
|
|
75
|
+
|
|
76
|
+
# Generate bootstrap credentials (these go in .env, not as secrets)
|
|
77
|
+
config["AUTHENTIK_BOOTSTRAP_PASSWORD"] = secrets.token_urlsafe(32)
|
|
78
|
+
config["AUTHENTIK_BOOTSTRAP_TOKEN"] = secrets.token_urlsafe(32)
|
|
79
|
+
|
|
80
|
+
# Update self.config so generate_secrets() can access these values
|
|
81
|
+
self.config.update(config)
|
|
82
|
+
|
|
83
|
+
return config
|
|
84
|
+
|
|
85
|
+
def generate_secrets(self) -> dict[str, str]:
|
|
86
|
+
"""Generate Authentik-related secrets."""
|
|
87
|
+
return {
|
|
88
|
+
"authentik_database_name": self.config["AUTHENTIK_DATABASE_NAME"],
|
|
89
|
+
"authentik_database_user": self.config["AUTHENTIK_DATABASE_USER"],
|
|
90
|
+
"authentik_database_password": secrets.token_hex(),
|
|
91
|
+
"authentik_secret_key": secrets.token_hex(),
|
|
92
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
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
|
+
|
|
16
|
+
def validate_smtp_host(value: str) -> ValidationSuccess[str] | ValidationError:
|
|
17
|
+
"""
|
|
18
|
+
Validate that the SMTP host is a hostname or domain name, not a raw IP address.
|
|
19
|
+
|
|
20
|
+
An empty value is allowed (it means SMTP is not yet configured).
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
value: The SMTP host value to validate
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
ValidationSuccess with the host string, or ValidationError with a message
|
|
27
|
+
"""
|
|
28
|
+
host = str(value).strip()
|
|
29
|
+
|
|
30
|
+
if not host:
|
|
31
|
+
# Empty is allowed — the operator can leave SMTP unconfigured
|
|
32
|
+
return ValidationSuccess(host)
|
|
33
|
+
|
|
34
|
+
# Reject raw IP addresses (both IPv4 and IPv6)
|
|
35
|
+
try:
|
|
36
|
+
ipaddress.ip_address(host)
|
|
37
|
+
return ValidationError(
|
|
38
|
+
f"'{host}' is a raw IP address. "
|
|
39
|
+
"SMTP_HOST must be a hostname or domain name, not an IP address. "
|
|
40
|
+
"Examples: 'smtp.example.com', 'smtp.sendgrid.net', 'mail.example.com'."
|
|
41
|
+
)
|
|
42
|
+
except ValueError:
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
return ValidationSuccess(host)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class EmailStep(DeploymentStep):
|
|
49
|
+
"""Handles email configuration and credentials."""
|
|
50
|
+
|
|
51
|
+
name = "email"
|
|
52
|
+
description = "Configure SMTP email settings and credentials"
|
|
53
|
+
|
|
54
|
+
def collect_config(self) -> dict[str, Any]:
|
|
55
|
+
"""Collect email configuration."""
|
|
56
|
+
config = {}
|
|
57
|
+
|
|
58
|
+
print("\n--- Email Configuration ---")
|
|
59
|
+
self.printer.print(
|
|
60
|
+
"This section configures how the deployment sends outbound emails, mainly "
|
|
61
|
+
"for Authentik account and password workflows.\n"
|
|
62
|
+
"\n"
|
|
63
|
+
"The deployment needs an SMTP server to send emails such as account setup, "
|
|
64
|
+
"password reset, and other authentication-related messages.\n"
|
|
65
|
+
"\n"
|
|
66
|
+
"You can use:\n"
|
|
67
|
+
" - your own SMTP provider or mail server\n"
|
|
68
|
+
" - an SMTP service provided by Octopize, based on AWS\n"
|
|
69
|
+
"\n"
|
|
70
|
+
"If Octopize provides the SMTP service, we will give you the SMTP "
|
|
71
|
+
"credentials. In that case, the tool could eventually prefill the standard "
|
|
72
|
+
"connection settings and only ask you for the username and password we "
|
|
73
|
+
"provide."
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# SMTP configuration
|
|
77
|
+
config["SMTP_HOST"] = self.get_config_or_prompt_generic(
|
|
78
|
+
PromptConfig(
|
|
79
|
+
config_key="SMTP_HOST",
|
|
80
|
+
prompt_message="SMTP host",
|
|
81
|
+
default_value=self.get_default_value("email.smtp.host"),
|
|
82
|
+
prompt_key="email.smtp_host",
|
|
83
|
+
parse_and_validate=validate_smtp_host,
|
|
84
|
+
help_text=(
|
|
85
|
+
"Hostname of the outbound SMTP server used to send emails from the "
|
|
86
|
+
"deployment.\n"
|
|
87
|
+
"\n"
|
|
88
|
+
"Use a mail server hostname or domain name, for example:\n"
|
|
89
|
+
" - smtp.gmail.com\n"
|
|
90
|
+
" - smtp.sendgrid.net\n"
|
|
91
|
+
" - mail.example.com\n"
|
|
92
|
+
"\n"
|
|
93
|
+
"Do not use an IP address here.\n"
|
|
94
|
+
"\n"
|
|
95
|
+
"This SMTP server is used by Authentik to send emails such as account "
|
|
96
|
+
"setup and password reset messages."
|
|
97
|
+
),
|
|
98
|
+
)
|
|
99
|
+
)
|
|
100
|
+
config["SMTP_PORT"] = self.get_config_or_prompt_generic(
|
|
101
|
+
PromptConfig(
|
|
102
|
+
config_key="SMTP_PORT",
|
|
103
|
+
prompt_message="SMTP port",
|
|
104
|
+
default_value=self.get_default_value("email.smtp.port"),
|
|
105
|
+
prompt_key="email.smtp_port",
|
|
106
|
+
parse_and_validate=parse_str,
|
|
107
|
+
help_text=(
|
|
108
|
+
"TCP port for the SMTP connection.\n"
|
|
109
|
+
"Common values:\n"
|
|
110
|
+
" 587 — STARTTLS (recommended)\n"
|
|
111
|
+
" 465 — TLS/SSL\n"
|
|
112
|
+
" 25 — plain SMTP (often blocked by ISPs)"
|
|
113
|
+
),
|
|
114
|
+
)
|
|
115
|
+
)
|
|
116
|
+
config["SMTP_USE_TLS"] = self.get_config("SMTP_USE_TLS", DefaultKey("email.smtp.use_tls"))
|
|
117
|
+
config["SMTP_START_TLS"] = self.get_config(
|
|
118
|
+
"SMTP_START_TLS", DefaultKey("email.smtp.start_tls")
|
|
119
|
+
)
|
|
120
|
+
config["SMTP_VERIFY"] = self.get_config("SMTP_VERIFY", DefaultKey("email.smtp.verify"))
|
|
121
|
+
config["SMTP_SENDER_EMAIL"] = self.get_config_or_prompt_generic(
|
|
122
|
+
PromptConfig(
|
|
123
|
+
config_key="SMTP_SENDER_EMAIL",
|
|
124
|
+
prompt_message="SMTP sender email",
|
|
125
|
+
default_value=self.get_default_value("email.smtp.sender_email"),
|
|
126
|
+
prompt_key="email.smtp_sender_email",
|
|
127
|
+
help_text=(
|
|
128
|
+
"The From: address used for all outbound emails sent by the deployment.\n"
|
|
129
|
+
"\n"
|
|
130
|
+
"This address must be authorized to send through the configured SMTP "
|
|
131
|
+
"server.\n"
|
|
132
|
+
"\n"
|
|
133
|
+
"In most cases, you should keep the default or the value recommended for "
|
|
134
|
+
"your SMTP setup. Only change it if you have a specific need, for example "
|
|
135
|
+
"if your SMTP provider requires the sender address to be the same as the "
|
|
136
|
+
"SMTP username.\n"
|
|
137
|
+
"\n"
|
|
138
|
+
"Example:\n"
|
|
139
|
+
" - noreply@avatar.example.com"
|
|
140
|
+
),
|
|
141
|
+
)
|
|
142
|
+
)
|
|
143
|
+
config["SMTP_USERNAME"] = self.get_config_or_prompt_generic(
|
|
144
|
+
PromptConfig(
|
|
145
|
+
config_key="SMTP_USERNAME",
|
|
146
|
+
prompt_message="SMTP username",
|
|
147
|
+
default_value="",
|
|
148
|
+
prompt_key="email.smtp_username",
|
|
149
|
+
help_text=(
|
|
150
|
+
"Username for SMTP authentication. Leave blank if your server\n"
|
|
151
|
+
"does not require authentication."
|
|
152
|
+
),
|
|
153
|
+
)
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
self.config.update(config)
|
|
157
|
+
|
|
158
|
+
return config
|
|
159
|
+
|
|
160
|
+
def generate_secrets(self) -> dict[str, str]:
|
|
161
|
+
"""Generate email-related secrets."""
|
|
162
|
+
secrets_dict = {}
|
|
163
|
+
|
|
164
|
+
if self.interactive:
|
|
165
|
+
smtp_password = self.prompt(
|
|
166
|
+
"SMTP password (press Enter to skip)",
|
|
167
|
+
default="",
|
|
168
|
+
key="email.smtp_password",
|
|
169
|
+
help_text=(
|
|
170
|
+
"Password for SMTP authentication.\n"
|
|
171
|
+
"\n"
|
|
172
|
+
"Leave blank if your SMTP server does not require a password."
|
|
173
|
+
),
|
|
174
|
+
)
|
|
175
|
+
if smtp_password:
|
|
176
|
+
secrets_dict["smtp_password"] = smtp_password
|
|
177
|
+
|
|
178
|
+
return secrets_dict
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"""Nginx TLS configuration step."""
|
|
2
|
+
|
|
3
|
+
import socket
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from .base import DeploymentStep, PromptConfig, parse_bool
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def is_port_in_use(port: int) -> bool:
|
|
10
|
+
"""Return True if something is already listening on *port* on localhost."""
|
|
11
|
+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
|
12
|
+
sock.settimeout(1)
|
|
13
|
+
return sock.connect_ex(("127.0.0.1", port)) == 0
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class NginxTlsStep(DeploymentStep):
|
|
17
|
+
"""Handles Nginx TLS configuration."""
|
|
18
|
+
|
|
19
|
+
name = "nginx_tls"
|
|
20
|
+
description = "Configure Nginx TLS and HTTP settings"
|
|
21
|
+
|
|
22
|
+
def collect_config(self) -> dict[str, Any]:
|
|
23
|
+
"""Collect Nginx TLS and HTTP configuration."""
|
|
24
|
+
config: dict[str, Any] = {}
|
|
25
|
+
|
|
26
|
+
self.printer.print("\n--- Nginx / TLS Configuration ---")
|
|
27
|
+
self.printer.print(
|
|
28
|
+
"This section defines how users will reach the deployment through the Nginx "
|
|
29
|
+
"reverse proxy.\n"
|
|
30
|
+
"\n"
|
|
31
|
+
"Here you decide whether Nginx serves plain HTTP or terminates HTTPS/TLS "
|
|
32
|
+
"directly. If you enable TLS, you will need to provide the certificate and "
|
|
33
|
+
"private key files used by Nginx.\n"
|
|
34
|
+
"\n"
|
|
35
|
+
"If you plan to enable TLS here, the public URL you entered earlier should be "
|
|
36
|
+
"an HTTPS URL and should match the DNS name covered by your certificate."
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
default_tls_enabled = bool(self.get_default_value("nginx.tls_enabled"))
|
|
40
|
+
default_http_port = str(self.get_default_value("nginx.http_port"))
|
|
41
|
+
default_cert_path = self.get_default_value("nginx.ssl_certificate_path")
|
|
42
|
+
default_key_path = self.get_default_value("nginx.ssl_certificate_key_path")
|
|
43
|
+
|
|
44
|
+
# Use generic prompt with boolean parser and yes/no prompt
|
|
45
|
+
tls_enabled = self.get_config_or_prompt_generic(
|
|
46
|
+
PromptConfig(
|
|
47
|
+
config_key="NGINX_TLS_ENABLED",
|
|
48
|
+
prompt_message="Enable TLS for Nginx?",
|
|
49
|
+
default_value=default_tls_enabled,
|
|
50
|
+
prompt_key="nginx_tls.enabled",
|
|
51
|
+
prompt_function=self.prompt_yes_no,
|
|
52
|
+
parse_and_validate=parse_bool,
|
|
53
|
+
help_text=(
|
|
54
|
+
"Enable this if Nginx should terminate HTTPS/TLS for the deployment.\n"
|
|
55
|
+
"\n"
|
|
56
|
+
"Choose yes only if:\n"
|
|
57
|
+
" - the public URL entered earlier is an https:// URL\n"
|
|
58
|
+
" - the DNS name for that URL points to this deployment\n"
|
|
59
|
+
" - you have a valid certificate and private key for that hostname\n"
|
|
60
|
+
"\n"
|
|
61
|
+
"If you enable TLS, the next prompts will ask for the certificate and "
|
|
62
|
+
"key file paths used by Nginx.\n"
|
|
63
|
+
"\n"
|
|
64
|
+
"If your setup handles TLS elsewhere and Nginx should serve only plain "
|
|
65
|
+
"HTTP locally, choose no."
|
|
66
|
+
),
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
config["NGINX_TLS_ENABLED"] = tls_enabled
|
|
71
|
+
|
|
72
|
+
if tls_enabled:
|
|
73
|
+
cert_path = self.get_config_or_prompt_generic(
|
|
74
|
+
PromptConfig(
|
|
75
|
+
config_key="NGINX_SSL_CERTIFICATE_PATH",
|
|
76
|
+
prompt_message="Path to TLS certificate (full chain)",
|
|
77
|
+
default_value=default_cert_path,
|
|
78
|
+
prompt_key="nginx_tls.ssl_certificate_path",
|
|
79
|
+
help_text=(
|
|
80
|
+
"Path to the TLS certificate file that Nginx will present to clients.\n"
|
|
81
|
+
"\n"
|
|
82
|
+
"Use a PEM-formatted full-chain certificate file. This should include "
|
|
83
|
+
"the server certificate and the intermediate certificates needed by "
|
|
84
|
+
"clients.\n"
|
|
85
|
+
"\n"
|
|
86
|
+
"Expected input:\n"
|
|
87
|
+
" - a readable file path on the current machine\n"
|
|
88
|
+
" - PEM format\n"
|
|
89
|
+
" - full chain certificate\n"
|
|
90
|
+
"\n"
|
|
91
|
+
"If your certificate is currently in PKCS#12 format, convert it first:\n"
|
|
92
|
+
"https://docs.octopize.io/docs/deploying/self-hosted/self_installation#convert-pkcs12-certificate-to-pem-format\n"
|
|
93
|
+
"\n"
|
|
94
|
+
"Recommended permissions:\n"
|
|
95
|
+
" - certificate file readable by the current user\n"
|
|
96
|
+
" - for example:\n"
|
|
97
|
+
" chmod 644 /app/avatar/tls/server.fullchain.crt\n"
|
|
98
|
+
"\n"
|
|
99
|
+
"Make sure the file exists and is readable by the current user running "
|
|
100
|
+
"the deployment commands."
|
|
101
|
+
),
|
|
102
|
+
)
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
key_path = self.get_config_or_prompt_generic(
|
|
106
|
+
PromptConfig(
|
|
107
|
+
config_key="NGINX_SSL_CERTIFICATE_KEY_PATH",
|
|
108
|
+
prompt_message="Path to TLS private key (decrypted)",
|
|
109
|
+
default_value=default_key_path,
|
|
110
|
+
prompt_key="nginx_tls.ssl_certificate_key_path",
|
|
111
|
+
help_text=(
|
|
112
|
+
"Path to the TLS private key file that matches the certificate "
|
|
113
|
+
"configured in the previous step.\n"
|
|
114
|
+
"\n"
|
|
115
|
+
"Use a decrypted private key in PEM format.\n"
|
|
116
|
+
"\n"
|
|
117
|
+
"Expected input:\n"
|
|
118
|
+
" - a readable file path on the current machine\n"
|
|
119
|
+
" - PEM format\n"
|
|
120
|
+
" - an unencrypted private key that Nginx can read at startup\n"
|
|
121
|
+
" - a key matching the configured certificate\n"
|
|
122
|
+
"\n"
|
|
123
|
+
"If your key is currently encrypted or bundled in a PKCS#12 archive, "
|
|
124
|
+
"convert/export it first using the deployment documentation:\n"
|
|
125
|
+
"https://docs.octopize.io/docs/deploying/self-hosted/self_installation#convert-pkcs12-certificate-to-pem-format\n"
|
|
126
|
+
"\n"
|
|
127
|
+
"Recommended permissions:\n"
|
|
128
|
+
" - private key readable by the current user\n"
|
|
129
|
+
" - private key kept as restrictive as possible\n"
|
|
130
|
+
" - for example:\n"
|
|
131
|
+
" chmod 600 /app/avatar/tls/private/server.decrypted.key\n"
|
|
132
|
+
"\n"
|
|
133
|
+
"Make sure the file exists and is readable by the current user running "
|
|
134
|
+
"the deployment commands."
|
|
135
|
+
),
|
|
136
|
+
)
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
config["NGINX_SSL_CERTIFICATE_PATH"] = cert_path
|
|
140
|
+
config["NGINX_SSL_CERTIFICATE_KEY_PATH"] = key_path
|
|
141
|
+
else:
|
|
142
|
+
http_port = self.get_config_or_prompt_generic(
|
|
143
|
+
PromptConfig(
|
|
144
|
+
config_key="NGINX_HTTP_PORT",
|
|
145
|
+
prompt_message="HTTP port for Nginx",
|
|
146
|
+
default_value=default_http_port,
|
|
147
|
+
prompt_key="nginx_tls.http_port",
|
|
148
|
+
help_text=(
|
|
149
|
+
"TCP port on which Nginx will listen for plain HTTP traffic when TLS "
|
|
150
|
+
"is disabled.\n"
|
|
151
|
+
"\n"
|
|
152
|
+
"If you press Enter, the default shown in the prompt will be used.\n"
|
|
153
|
+
"\n"
|
|
154
|
+
"Common choices:\n"
|
|
155
|
+
" - 8080 for a local or reverse-proxied setup\n"
|
|
156
|
+
" - 80 for a directly exposed HTTP service\n"
|
|
157
|
+
"\n"
|
|
158
|
+
"Choose a port that is reachable in your deployment setup and not "
|
|
159
|
+
"already reserved by another service.\n"
|
|
160
|
+
"\n"
|
|
161
|
+
"This setting is only used when TLS is disabled in this tool."
|
|
162
|
+
),
|
|
163
|
+
)
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
config["NGINX_HTTP_PORT"] = http_port
|
|
167
|
+
config["NGINX_SSL_CERTIFICATE_PATH"] = "/dev/null"
|
|
168
|
+
config["NGINX_SSL_CERTIFICATE_KEY_PATH"] = "/dev/null"
|
|
169
|
+
|
|
170
|
+
try:
|
|
171
|
+
port_number = int(http_port)
|
|
172
|
+
if is_port_in_use(port_number):
|
|
173
|
+
self.printer.print_warning(
|
|
174
|
+
f"Port {http_port} appears to be already in use. "
|
|
175
|
+
"This is expected if you are re-running the tool for an existing "
|
|
176
|
+
"deployment, but may cause startup failures otherwise."
|
|
177
|
+
)
|
|
178
|
+
except (ValueError, OSError):
|
|
179
|
+
# ValueError: http_port is not a valid integer (validation handled elsewhere).
|
|
180
|
+
# OSError: the socket probe itself failed (e.g. unusual network config).
|
|
181
|
+
# Neither case should block configuration; skip the check silently.
|
|
182
|
+
pass
|
|
183
|
+
|
|
184
|
+
return config
|
|
185
|
+
|
|
186
|
+
def generate_secrets(self) -> dict[str, str]:
|
|
187
|
+
"""No secrets needed for Nginx TLS paths."""
|
|
188
|
+
return {}
|