fujin-cli 0.13.2__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.
Files changed (87) hide show
  1. fujin_cli-0.13.2/.github/workflows/publish.yml +169 -0
  2. fujin_cli-0.13.2/.github/workflows/test.yml +21 -0
  3. fujin_cli-0.13.2/.gitignore +152 -0
  4. fujin_cli-0.13.2/.pre-commit-config.yaml +43 -0
  5. fujin_cli-0.13.2/.readthedocs.yaml +24 -0
  6. fujin_cli-0.13.2/CHANGELOG.md +118 -0
  7. fujin_cli-0.13.2/LICENSE.txt +9 -0
  8. fujin_cli-0.13.2/PKG-INFO +81 -0
  9. fujin_cli-0.13.2/README.md +51 -0
  10. fujin_cli-0.13.2/Vagrantfile +85 -0
  11. fujin_cli-0.13.2/docs/changelog.rst +2 -0
  12. fujin_cli-0.13.2/docs/commands/app.rst +6 -0
  13. fujin_cli-0.13.2/docs/commands/config.rst +6 -0
  14. fujin_cli-0.13.2/docs/commands/deploy.rst +68 -0
  15. fujin_cli-0.13.2/docs/commands/docs.rst +6 -0
  16. fujin_cli-0.13.2/docs/commands/down.rst +6 -0
  17. fujin_cli-0.13.2/docs/commands/index.rst +22 -0
  18. fujin_cli-0.13.2/docs/commands/init.rst +61 -0
  19. fujin_cli-0.13.2/docs/commands/printenv.rst +7 -0
  20. fujin_cli-0.13.2/docs/commands/prune.rst +7 -0
  21. fujin_cli-0.13.2/docs/commands/rollback.rst +7 -0
  22. fujin_cli-0.13.2/docs/commands/server.rst +6 -0
  23. fujin_cli-0.13.2/docs/commands/up.rst +6 -0
  24. fujin_cli-0.13.2/docs/conf.py +43 -0
  25. fujin_cli-0.13.2/docs/configuration.rst +238 -0
  26. fujin_cli-0.13.2/docs/howtos/binary.rst +85 -0
  27. fujin_cli-0.13.2/docs/howtos/django.rst +137 -0
  28. fujin_cli-0.13.2/docs/howtos/index.rst +83 -0
  29. fujin_cli-0.13.2/docs/index.rst +29 -0
  30. fujin_cli-0.13.2/docs/installation.rst +23 -0
  31. fujin_cli-0.13.2/docs/integrations.rst +149 -0
  32. fujin_cli-0.13.2/docs/requirements.txt +100 -0
  33. fujin_cli-0.13.2/docs/secrets.rst +93 -0
  34. fujin_cli-0.13.2/examples/django/bookstore/README.md +200 -0
  35. fujin_cli-0.13.2/examples/django/bookstore/bookstore/__init__.py +0 -0
  36. fujin_cli-0.13.2/examples/django/bookstore/bookstore/__main__.py +23 -0
  37. fujin_cli-0.13.2/examples/django/bookstore/bookstore/asgi.py +16 -0
  38. fujin_cli-0.13.2/examples/django/bookstore/bookstore/settings.py +125 -0
  39. fujin_cli-0.13.2/examples/django/bookstore/bookstore/urls.py +23 -0
  40. fujin_cli-0.13.2/examples/django/bookstore/bookstore/wsgi.py +16 -0
  41. fujin_cli-0.13.2/examples/django/bookstore/fujin.toml +34 -0
  42. fujin_cli-0.13.2/examples/django/bookstore/manage.py +0 -0
  43. fujin_cli-0.13.2/examples/django/bookstore/pyproject.toml +18 -0
  44. fujin_cli-0.13.2/examples/django/bookstore/requirements.txt +23 -0
  45. fujin_cli-0.13.2/examples/golang/pocketbase/.env.prod +0 -0
  46. fujin_cli-0.13.2/examples/golang/pocketbase/fujin.toml +22 -0
  47. fujin_cli-0.13.2/justfile +104 -0
  48. fujin_cli-0.13.2/para_ssh.py +0 -0
  49. fujin_cli-0.13.2/pyproject.toml +225 -0
  50. fujin_cli-0.13.2/src/fujin/__init__.py +1 -0
  51. fujin_cli-0.13.2/src/fujin/__main__.py +70 -0
  52. fujin_cli-0.13.2/src/fujin/caddy.py +128 -0
  53. fujin_cli-0.13.2/src/fujin/commands/__init__.py +1 -0
  54. fujin_cli-0.13.2/src/fujin/commands/_base.py +38 -0
  55. fujin_cli-0.13.2/src/fujin/commands/app.py +205 -0
  56. fujin_cli-0.13.2/src/fujin/commands/config.py +113 -0
  57. fujin_cli-0.13.2/src/fujin/commands/deploy.py +270 -0
  58. fujin_cli-0.13.2/src/fujin/commands/docs.py +14 -0
  59. fujin_cli-0.13.2/src/fujin/commands/down.py +64 -0
  60. fujin_cli-0.13.2/src/fujin/commands/init.py +185 -0
  61. fujin_cli-0.13.2/src/fujin/commands/printenv.py +18 -0
  62. fujin_cli-0.13.2/src/fujin/commands/prune.py +43 -0
  63. fujin_cli-0.13.2/src/fujin/commands/rollback.py +50 -0
  64. fujin_cli-0.13.2/src/fujin/commands/server.py +92 -0
  65. fujin_cli-0.13.2/src/fujin/commands/up.py +15 -0
  66. fujin_cli-0.13.2/src/fujin/config.py +290 -0
  67. fujin_cli-0.13.2/src/fujin/connection.py +73 -0
  68. fujin_cli-0.13.2/src/fujin/errors.py +5 -0
  69. fujin_cli-0.13.2/src/fujin/secrets.py +169 -0
  70. fujin_cli-0.13.2/src/fujin/templates/Caddyfile.j2 +10 -0
  71. fujin_cli-0.13.2/src/fujin/templates/default.service.j2 +14 -0
  72. fujin_cli-0.13.2/src/fujin/templates/default.socket.j2 +11 -0
  73. fujin_cli-0.13.2/src/fujin/templates/default.timer.j2 +9 -0
  74. fujin_cli-0.13.2/src/fujin/templates/web.service.j2 +27 -0
  75. fujin_cli-0.13.2/tests/__init__.py +0 -0
  76. fujin_cli-0.13.2/tests/conftest.py +70 -0
  77. fujin_cli-0.13.2/tests/integration/Dockerfile +40 -0
  78. fujin_cli-0.13.2/tests/integration/conftest.py +103 -0
  79. fujin_cli-0.13.2/tests/integration/test_full_deploy.py +110 -0
  80. fujin_cli-0.13.2/tests/test_app.py +27 -0
  81. fujin_cli-0.13.2/tests/test_config.py +152 -0
  82. fujin_cli-0.13.2/tests/test_deploy.py +509 -0
  83. fujin_cli-0.13.2/tests/test_down.py +56 -0
  84. fujin_cli-0.13.2/tests/test_init.py +47 -0
  85. fujin_cli-0.13.2/tests/test_prune.py +19 -0
  86. fujin_cli-0.13.2/tests/test_rollback.py +49 -0
  87. fujin_cli-0.13.2/uv.lock +1764 -0
@@ -0,0 +1,169 @@
1
+ name: Publish package
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*.*.*"
7
+
8
+ jobs:
9
+ build-python-wheel-and-sdist:
10
+ name: Build a pure Python wheel and source distribution
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - name: Checkout code
14
+ uses: actions/checkout@v4
15
+
16
+ - name: Install uv
17
+ uses: astral-sh/setup-uv@v3
18
+
19
+ - name: Build
20
+ run: uv build
21
+
22
+ - uses: actions/upload-artifact@v4
23
+ with:
24
+ name: wheels
25
+ path: dist/*
26
+ if-no-files-found: error
27
+ overwrite: true
28
+
29
+ build-binaries:
30
+ name: Build binary application for ${{ matrix.job.target }} (${{ matrix.job.os }})
31
+ runs-on: ${{ matrix.job.os }}
32
+ needs: build-python-wheel-and-sdist
33
+ strategy:
34
+ fail-fast: false
35
+ matrix:
36
+ job:
37
+ # Linux
38
+ - target: x86_64-unknown-linux-gnu
39
+ os: ubuntu-latest
40
+ cross: true
41
+ release_suffix: x86_64-linux
42
+ - target: x86_64-unknown-linux-musl
43
+ os: ubuntu-latest
44
+ cross: true
45
+ release_suffix: x86_64-linux-musl
46
+ - target: aarch64-unknown-linux-gnu
47
+ os: ubuntu-latest
48
+ cross: true
49
+ release_suffix: aarch64-linux
50
+ # - target: i686-unknown-linux-gnu
51
+ # os: ubuntu-latest
52
+ # cross: true
53
+ # release_suffix: i686-linux
54
+ # Windows
55
+ # - target: x86_64-pc-windows-msvc
56
+ # os: windows-2022
57
+ # release_suffix: x86_64-windows
58
+ # - target: i686-pc-windows-msvc
59
+ # os: windows-2022
60
+ # release_suffix: i686-windows
61
+ # macOS
62
+ # - target: aarch64-apple-darwin
63
+ # os: macos-12
64
+ # release_suffix: aarch64-osx
65
+ # - target: x86_64-apple-darwin
66
+ # os: macos-12
67
+ # release_suffix: x86_64-osx
68
+
69
+ env:
70
+ CARGO_BUILD_TARGET: ${{ matrix.job.target }}
71
+
72
+ steps:
73
+ - name: Install uv
74
+ uses: astral-sh/setup-uv@v3
75
+
76
+ - name: Install just
77
+ uses: extractions/setup-just@v2
78
+
79
+ - name: Code Checkout
80
+ uses: actions/checkout@v4
81
+
82
+ - name: Install musl-tools on Linux
83
+ run: sudo apt-get install --yes musl musl-dev musl-tools
84
+ if: ${{ matrix.job.os == 'ubuntu-latest' }}
85
+
86
+ - name: Install Rust toolchain
87
+ if: ${{ !matrix.job.cross }}
88
+ uses: dtolnay/rust-toolchain@stable
89
+ with:
90
+ targets: ${{ matrix.job.target }}
91
+
92
+ - name: Set up cross compiling tools
93
+ if: matrix.job.cross
94
+ uses: taiki-e/setup-cross-toolchain-action@v1
95
+ with:
96
+ target: ${{ matrix.job.target}}
97
+
98
+ - name: Show toolchain information
99
+ run: |-
100
+ rustup toolchain list
101
+ rustup default
102
+ rustup -V
103
+ rustc -V
104
+ cargo -V
105
+ uv --version
106
+
107
+ - uses: actions/download-artifact@v4
108
+ with:
109
+ name: wheels
110
+ path: ${{ github.workspace }}/dist
111
+ merge-multiple: true
112
+
113
+ - name: Build binary
114
+ run: just build-bin
115
+
116
+ - name: Rename
117
+ working-directory: ${{ github.workspace }}
118
+ run: |-
119
+ mv dist/bin/fujin_cli* dist/bin/fujin_cli-${{ matrix.job.release_suffix }}
120
+
121
+ - name: Upload built binary package
122
+ uses: actions/upload-artifact@v4
123
+ with:
124
+ name: binaries-${{ matrix.job.release_suffix }}
125
+ path: dist/bin/*
126
+ if-no-files-found: error
127
+
128
+ publish-to-pypi:
129
+ name: Publish to PyPI
130
+ runs-on: ubuntu-latest
131
+ permissions:
132
+ id-token: write
133
+ needs: [build-python-wheel-and-sdist, build-binaries]
134
+ steps:
135
+ - name: Checkout code
136
+ uses: actions/checkout@v4
137
+
138
+ - uses: actions/download-artifact@v4
139
+ with:
140
+ name: wheels
141
+ path: dist
142
+
143
+ - uses: pypa/gh-action-pypi-publish@release/v1
144
+
145
+ release:
146
+ name: Create a GitHub release
147
+ runs-on: ubuntu-latest
148
+ permissions:
149
+ contents: write
150
+ needs: [build-python-wheel-and-sdist, build-binaries]
151
+ steps:
152
+ - name: Checkout code
153
+ uses: actions/checkout@v4
154
+
155
+ - uses: actions/download-artifact@v4
156
+ with:
157
+ path: dist
158
+ merge-multiple: true
159
+
160
+ - name: Generate Changelog
161
+ run: |
162
+ awk '/^## /{if (p) exit; p=1; next} p' ${{ github.workspace }}/CHANGELOG.md | tee ${{ github.workspace }}-CHANGELOG.txt
163
+
164
+ - name: Release
165
+ uses: softprops/action-gh-release@v2
166
+ with:
167
+ body_path: ${{ github.workspace }}-CHANGELOG.txt
168
+ files: dist/*
169
+ fail_on_unmatched_files: true
@@ -0,0 +1,21 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ jobs:
8
+ test:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - name: Checkout code
12
+ uses: actions/checkout@v4
13
+
14
+ - name: Install uv
15
+ uses: astral-sh/setup-uv@v3
16
+
17
+ - name: Install just
18
+ uses: extractions/setup-just@v2
19
+
20
+ - name: Run tests
21
+ run: just test
@@ -0,0 +1,152 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ pip-wheel-metadata/
24
+ share/python-wheels/
25
+ *.egg-info/
26
+ .installed.cfg
27
+ *.egg
28
+ MANIFEST
29
+
30
+ # PyInstaller
31
+ # Usually these files are written by a python script from a template
32
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
33
+ *.manifest
34
+ *.spec
35
+
36
+ # Installer logs
37
+ pip-log.txt
38
+ pip-delete-this-directory.txt
39
+
40
+ # Unit test / coverage reports
41
+ htmlcov/
42
+ .tox/
43
+ .nox/
44
+ .coverage
45
+ .coverage.*
46
+ .cache
47
+ nosetests.xml
48
+ coverage.xml
49
+ *.cover
50
+ *.py,cover
51
+ .hypothesis/
52
+ .pytest_cache/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ *.sqlite3
62
+ *.sqlite3-journal
63
+ *.sqlite3-shm
64
+ *.sqlite3-wal
65
+ *.db
66
+ *.db-journal
67
+ *.db-shm
68
+ *.db-wal
69
+ *staticfiles/
70
+ *media
71
+
72
+ # db dumps
73
+ *.dump
74
+
75
+ # Flask stuff:
76
+ instance/
77
+ .webassets-cache
78
+
79
+ # Scrapy stuff:
80
+ .scrapy
81
+
82
+ # Sphinx documentation
83
+ docs/_build/
84
+
85
+ # PyBuilder
86
+ target/
87
+
88
+ # Jupyter Notebook
89
+ .ipynb_checkpoints
90
+
91
+ # IPython
92
+ profile_default/
93
+ ipython_config.py
94
+
95
+ # pyenv
96
+ .python-version
97
+
98
+ # pipenv
99
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
100
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
101
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
102
+ # install all needed dependencies.
103
+ #Pipfile.lock
104
+
105
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow
106
+ __pypackages__/
107
+
108
+ # Celery stuff
109
+ celerybeat-schedule
110
+ celerybeat.pid
111
+
112
+ # SageMath parsed files
113
+ *.sage.py
114
+
115
+ # Environments
116
+ .env
117
+ examples/django/bookstore/.env.prod
118
+ .venv
119
+ env/
120
+ venv/
121
+ ENV/
122
+ env.bak/
123
+ venv.bak/
124
+
125
+ # Spyder project settings
126
+ .spyderproject
127
+ .spyproject
128
+
129
+ # Rope project settings
130
+ .ropeproject
131
+
132
+ # mkdocs documentation
133
+ /site
134
+
135
+ # mypy
136
+ .mypy_cache/
137
+ .dmypy.json
138
+ dmypy.json
139
+
140
+ # Pyre type checker
141
+ .pyre/
142
+
143
+ # Pycharm
144
+ .idea/
145
+
146
+ # MacOs
147
+ .DS_Store
148
+
149
+ id_rsa
150
+ id_rsa.pub
151
+ aws.pem
152
+ .vagrant
@@ -0,0 +1,43 @@
1
+ # See https://pre-commit.com for more information
2
+ # See https://pre-commit.com/hooks.html for more hooks
3
+ repos:
4
+ - repo: local
5
+ hooks:
6
+ - id: fmt
7
+ name: ruff format
8
+ entry: uvx ruff format
9
+ language: system
10
+ files: '\.py$'
11
+
12
+ - id: logchanges
13
+ name: update changelog
14
+ entry: just logchanges || true
15
+ language: system
16
+ pass_filenames: false
17
+
18
+ - repo: https://github.com/myint/autoflake
19
+ rev: v2.3.1
20
+ hooks:
21
+ - id: autoflake
22
+ exclude: .*/__init__.py
23
+ args:
24
+ - --in-place
25
+ - --remove-all-unused-imports
26
+ - --expand-star-imports
27
+ - --remove-duplicate-keys
28
+ - --remove-unused-variables
29
+
30
+
31
+ - repo: https://github.com/tox-dev/pyproject-fmt
32
+ rev: v2.11.1
33
+ hooks:
34
+ - id: pyproject-fmt
35
+ args: [ "pyproject.toml" ]
36
+ exclude: ^(examples/)
37
+
38
+ # - repo: https://github.com/asottile/reorder_python_imports
39
+ # rev: v3.13.0
40
+ # hooks:
41
+ # - id: reorder-python-imports
42
+ # args:
43
+ # - "--application-directories=src"
@@ -0,0 +1,24 @@
1
+ # Read the Docs configuration file
2
+ # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
3
+
4
+ # Required
5
+ version: 2
6
+
7
+ # Set the OS, Python version, and other tools you might need
8
+ build:
9
+ os: ubuntu-22.04
10
+ tools:
11
+ python: "3.12"
12
+
13
+ # Build documentation in the "docs/" directory with Sphinx
14
+ sphinx:
15
+ configuration: docs/conf.py
16
+
17
+ # Optionally, but recommended,
18
+ # declare the Python requirements required to build your documentation
19
+ # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
20
+ python:
21
+ install:
22
+ - requirements: docs/requirements.txt
23
+
24
+
@@ -0,0 +1,118 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [0.13.2] - 2025-11-28
8
+
9
+ ### πŸ› Bug Fixes
10
+
11
+ - Hanging interactive shell on 3.14
12
+
13
+ ## [0.13.1] - 2025-11-28
14
+
15
+ ### πŸ› Bug Fixes
16
+
17
+ - Broken cli because of missing gevent
18
+
19
+ ## [0.13.0] - 2025-11-27
20
+
21
+ ### πŸš€ Features
22
+
23
+ - [**breaking**] Refactor to ejectable defaults, enhanced config, and new docs
24
+
25
+ ## [0.12.2] - 2025-11-16
26
+
27
+ ### πŸ› Bug Fixes
28
+
29
+ - Dummy proxy
30
+
31
+ ### 🚜 Refactor
32
+
33
+ - Use custom caddy server name
34
+ - Less files
35
+
36
+ ## [0.12.1] - 2025-03-12
37
+
38
+ ### πŸš€ Features
39
+
40
+ - Add process name to systemd service
41
+ - Add fujin version info
42
+ - Set system as the default secrets adapter
43
+ - Add system secret reader
44
+
45
+ ### πŸ› Bug Fixes
46
+
47
+ - Force .venv removal on deploy
48
+ - Env content parse logic
49
+
50
+ ### 🚜 Refactor
51
+
52
+ - Rename env_content to env
53
+
54
+ ### πŸ“š Documentation
55
+
56
+ - Document integration with ci ci platforms
57
+ - Apply a more consistent writing style
58
+
59
+ ### βš™οΈ Miscellaneous Tasks
60
+
61
+ - Specify source package to avoid failing build backend
62
+
63
+ ## [0.10.0] - 2024-11-24
64
+
65
+ ### πŸš€ Features
66
+
67
+ - Add doppler support to secrets
68
+
69
+ ## [0.9.1] - 2024-11-23
70
+
71
+ ### 🚜 Refactor
72
+
73
+ - Drop configurable proxy manager
74
+
75
+ ### πŸ“š Documentation
76
+
77
+ - Add links to template systemd service files
78
+
79
+ ### ⚑ Performance
80
+
81
+ - Run systemd commands concurrently using gevent
82
+
83
+ ## [0.9.0] - 2024-11-23
84
+
85
+ ### πŸš€ Features
86
+
87
+ - Env content can be define directly in toml
88
+
89
+ ### 🚜 Refactor
90
+
91
+ - Avoid running secret adapter if no secret placeholder is found
92
+
93
+ ## [0.8.0] - 2024-11-23
94
+
95
+ ### πŸš€ Features
96
+
97
+ - Rewrite hooks (#30)
98
+
99
+ ## [0.7.1] - 2024-11-23
100
+
101
+ ### πŸ› Bug Fixes
102
+
103
+ - Broken .venv folder can fail deploy
104
+
105
+ ## [0.7.0] - 2024-11-22
106
+
107
+ ### πŸš€ Features
108
+
109
+ - Inject secrets via bitwarden and 1password (#29)
110
+ - Add certbot_email configuration for nginx
111
+
112
+ ### 🚜 Refactor
113
+
114
+ - Move requirements copy to transfer_files
115
+
116
+ ## [0.6.0] - 2024-11-19
117
+
118
+ <!-- generated by git-cliff -->
@@ -0,0 +1,9 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-present Tobi DEGNON <tobidegnon@proton.me>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,81 @@
1
+ Metadata-Version: 2.4
2
+ Name: fujin-cli
3
+ Version: 0.13.2
4
+ Summary: Get your project up and running in a few minutes on your own vps.
5
+ Project-URL: Documentation, https://github.com/falcopackages/fujin#readme
6
+ Project-URL: Issues, https://github.com/falcopackages/fujin/issues
7
+ Project-URL: Source, https://github.com/falcopackages/fujin
8
+ Author-email: Tobi DEGNON <tobidegnon@proton.me>
9
+ License-File: LICENSE.txt
10
+ Keywords: caddy,deployment,django,fastapi,litestar,python,systemd
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Natural Language :: English
14
+ Classifier: Programming Language :: Python
15
+ Classifier: Programming Language :: Python :: 3 :: Only
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: Implementation :: CPython
21
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
22
+ Requires-Python: <3.14,>=3.10
23
+ Requires-Dist: cappa>=0.24
24
+ Requires-Dist: fabric>=3.2.2
25
+ Requires-Dist: jinja2>=3.1.3
26
+ Requires-Dist: msgspec[toml]>=0.18.6
27
+ Requires-Dist: python-dotenv>=1.0.1
28
+ Requires-Dist: rich>=13.9.2
29
+ Description-Content-Type: text/markdown
30
+
31
+ # fujin
32
+
33
+ > [!IMPORTANT]
34
+ > This tool currently contains minimal features and is a work-in-progress
35
+
36
+ <!-- content:start -->
37
+
38
+ `fujin` is a simple deployment tool that helps you get your project up and running on a VPS in minutes. It manages your app processes using [systemd](https://systemd.io) and runs your apps behind [caddy](https://caddyserver.com).
39
+
40
+ [![Publish Package](https://github.com/falcopackages/fujin/actions/workflows/publish.yml/badge.svg)](https://github.com/falcopackages/fujin/actions/workflows/publish.yml)
41
+ [![PyPI - Version](https://img.shields.io/pypi/v/fujin-cli.svg)](https://pypi.org/project/fujin-cli)
42
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/fujin-cli.svg)](https://pypi.org/project/fujin-cli)
43
+ [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/falcopackages/fujin/blob/main/LICENSE.txt)
44
+ [![Status](https://img.shields.io/pypi/status/fujin-cli.svg)](https://pypi.org/project/fujin-cli)
45
+
46
+ ## Features
47
+
48
+ - πŸš€ One-command server bootstrap
49
+ - πŸ”„ Rollback broken deployments
50
+ - πŸ” Zero configuration SSL certificates via [Caddy](https://caddyserver.com)
51
+ - πŸ› οΈ Secrets injection from password managers ([Bitwarden](https://bitwarden.com/), [1Password](https://1password.com), etc.)
52
+ - πŸ“ **Ejectable Defaults**: Full control over `systemd` and `caddy` templates
53
+ - πŸ‘¨β€πŸ’» Remote application management and log streaming
54
+ - 🐍 Supports packaged python apps and self-contained binaries
55
+
56
+ For more details, check out the [documentationπŸ“š](https://fujin.oluwatobi.dev/en/latest/).
57
+
58
+ ## Why?
59
+
60
+ I wanted [kamal](https://kamal-deploy.org/) but without Docker, and I thought the idea was fun. At its core, this project automates versions of this [tutorial](https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu). If you've been a Django beginner
61
+ trying to get your app in production, you probably went through this.
62
+
63
+ I'm using `caddy` here instead of `nginx` because it's configurable via an API and it's is a no-brainer for SSL certificates. `Systemd` is the default on most Linux distributions and does a good enough job.
64
+
65
+ Fujin was initially planned to be a Python-only project, but the core concepts can be applied to any language that can produce a single distributable file (e.g., Go, Rust).
66
+
67
+ The goal is to automate deployment while leaving you in full control of your Linux box. It's not a CLI PaaS - it's simple and expects you to be able to SSH into your server and troubleshoot if necessary. For beginners, it makes the initial deployment easier while you get your hands dirty with Linux.
68
+ If you need a never-break, worry-free, set-it-and-forget-it setup that auto-scales and does all the magic, fujin probably isn't for you.
69
+
70
+ ## Inspiration and alternatives
71
+
72
+ Fujin draws inspiration from the following tools for their developer experience. These are better alternatives if you need a more robust, set-and-forget solution
73
+
74
+ - [fly.io](https://fly.io/)
75
+ - [kamal](https://kamal-deploy.org/) (you probably can't just forget this one)
76
+
77
+ ## License
78
+
79
+ `fujin` is distributed under the terms of the [MIT](https://spdx.org/licenses/MIT.html) license.
80
+
81
+ <!-- content:end -->
@@ -0,0 +1,51 @@
1
+ # fujin
2
+
3
+ > [!IMPORTANT]
4
+ > This tool currently contains minimal features and is a work-in-progress
5
+
6
+ <!-- content:start -->
7
+
8
+ `fujin` is a simple deployment tool that helps you get your project up and running on a VPS in minutes. It manages your app processes using [systemd](https://systemd.io) and runs your apps behind [caddy](https://caddyserver.com).
9
+
10
+ [![Publish Package](https://github.com/falcopackages/fujin/actions/workflows/publish.yml/badge.svg)](https://github.com/falcopackages/fujin/actions/workflows/publish.yml)
11
+ [![PyPI - Version](https://img.shields.io/pypi/v/fujin-cli.svg)](https://pypi.org/project/fujin-cli)
12
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/fujin-cli.svg)](https://pypi.org/project/fujin-cli)
13
+ [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/falcopackages/fujin/blob/main/LICENSE.txt)
14
+ [![Status](https://img.shields.io/pypi/status/fujin-cli.svg)](https://pypi.org/project/fujin-cli)
15
+
16
+ ## Features
17
+
18
+ - πŸš€ One-command server bootstrap
19
+ - πŸ”„ Rollback broken deployments
20
+ - πŸ” Zero configuration SSL certificates via [Caddy](https://caddyserver.com)
21
+ - πŸ› οΈ Secrets injection from password managers ([Bitwarden](https://bitwarden.com/), [1Password](https://1password.com), etc.)
22
+ - πŸ“ **Ejectable Defaults**: Full control over `systemd` and `caddy` templates
23
+ - πŸ‘¨β€πŸ’» Remote application management and log streaming
24
+ - 🐍 Supports packaged python apps and self-contained binaries
25
+
26
+ For more details, check out the [documentationπŸ“š](https://fujin.oluwatobi.dev/en/latest/).
27
+
28
+ ## Why?
29
+
30
+ I wanted [kamal](https://kamal-deploy.org/) but without Docker, and I thought the idea was fun. At its core, this project automates versions of this [tutorial](https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu). If you've been a Django beginner
31
+ trying to get your app in production, you probably went through this.
32
+
33
+ I'm using `caddy` here instead of `nginx` because it's configurable via an API and it's is a no-brainer for SSL certificates. `Systemd` is the default on most Linux distributions and does a good enough job.
34
+
35
+ Fujin was initially planned to be a Python-only project, but the core concepts can be applied to any language that can produce a single distributable file (e.g., Go, Rust).
36
+
37
+ The goal is to automate deployment while leaving you in full control of your Linux box. It's not a CLI PaaS - it's simple and expects you to be able to SSH into your server and troubleshoot if necessary. For beginners, it makes the initial deployment easier while you get your hands dirty with Linux.
38
+ If you need a never-break, worry-free, set-it-and-forget-it setup that auto-scales and does all the magic, fujin probably isn't for you.
39
+
40
+ ## Inspiration and alternatives
41
+
42
+ Fujin draws inspiration from the following tools for their developer experience. These are better alternatives if you need a more robust, set-and-forget solution
43
+
44
+ - [fly.io](https://fly.io/)
45
+ - [kamal](https://kamal-deploy.org/) (you probably can't just forget this one)
46
+
47
+ ## License
48
+
49
+ `fujin` is distributed under the terms of the [MIT](https://spdx.org/licenses/MIT.html) license.
50
+
51
+ <!-- content:end -->