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.
- fujin_cli-0.13.2/.github/workflows/publish.yml +169 -0
- fujin_cli-0.13.2/.github/workflows/test.yml +21 -0
- fujin_cli-0.13.2/.gitignore +152 -0
- fujin_cli-0.13.2/.pre-commit-config.yaml +43 -0
- fujin_cli-0.13.2/.readthedocs.yaml +24 -0
- fujin_cli-0.13.2/CHANGELOG.md +118 -0
- fujin_cli-0.13.2/LICENSE.txt +9 -0
- fujin_cli-0.13.2/PKG-INFO +81 -0
- fujin_cli-0.13.2/README.md +51 -0
- fujin_cli-0.13.2/Vagrantfile +85 -0
- fujin_cli-0.13.2/docs/changelog.rst +2 -0
- fujin_cli-0.13.2/docs/commands/app.rst +6 -0
- fujin_cli-0.13.2/docs/commands/config.rst +6 -0
- fujin_cli-0.13.2/docs/commands/deploy.rst +68 -0
- fujin_cli-0.13.2/docs/commands/docs.rst +6 -0
- fujin_cli-0.13.2/docs/commands/down.rst +6 -0
- fujin_cli-0.13.2/docs/commands/index.rst +22 -0
- fujin_cli-0.13.2/docs/commands/init.rst +61 -0
- fujin_cli-0.13.2/docs/commands/printenv.rst +7 -0
- fujin_cli-0.13.2/docs/commands/prune.rst +7 -0
- fujin_cli-0.13.2/docs/commands/rollback.rst +7 -0
- fujin_cli-0.13.2/docs/commands/server.rst +6 -0
- fujin_cli-0.13.2/docs/commands/up.rst +6 -0
- fujin_cli-0.13.2/docs/conf.py +43 -0
- fujin_cli-0.13.2/docs/configuration.rst +238 -0
- fujin_cli-0.13.2/docs/howtos/binary.rst +85 -0
- fujin_cli-0.13.2/docs/howtos/django.rst +137 -0
- fujin_cli-0.13.2/docs/howtos/index.rst +83 -0
- fujin_cli-0.13.2/docs/index.rst +29 -0
- fujin_cli-0.13.2/docs/installation.rst +23 -0
- fujin_cli-0.13.2/docs/integrations.rst +149 -0
- fujin_cli-0.13.2/docs/requirements.txt +100 -0
- fujin_cli-0.13.2/docs/secrets.rst +93 -0
- fujin_cli-0.13.2/examples/django/bookstore/README.md +200 -0
- fujin_cli-0.13.2/examples/django/bookstore/bookstore/__init__.py +0 -0
- fujin_cli-0.13.2/examples/django/bookstore/bookstore/__main__.py +23 -0
- fujin_cli-0.13.2/examples/django/bookstore/bookstore/asgi.py +16 -0
- fujin_cli-0.13.2/examples/django/bookstore/bookstore/settings.py +125 -0
- fujin_cli-0.13.2/examples/django/bookstore/bookstore/urls.py +23 -0
- fujin_cli-0.13.2/examples/django/bookstore/bookstore/wsgi.py +16 -0
- fujin_cli-0.13.2/examples/django/bookstore/fujin.toml +34 -0
- fujin_cli-0.13.2/examples/django/bookstore/manage.py +0 -0
- fujin_cli-0.13.2/examples/django/bookstore/pyproject.toml +18 -0
- fujin_cli-0.13.2/examples/django/bookstore/requirements.txt +23 -0
- fujin_cli-0.13.2/examples/golang/pocketbase/.env.prod +0 -0
- fujin_cli-0.13.2/examples/golang/pocketbase/fujin.toml +22 -0
- fujin_cli-0.13.2/justfile +104 -0
- fujin_cli-0.13.2/para_ssh.py +0 -0
- fujin_cli-0.13.2/pyproject.toml +225 -0
- fujin_cli-0.13.2/src/fujin/__init__.py +1 -0
- fujin_cli-0.13.2/src/fujin/__main__.py +70 -0
- fujin_cli-0.13.2/src/fujin/caddy.py +128 -0
- fujin_cli-0.13.2/src/fujin/commands/__init__.py +1 -0
- fujin_cli-0.13.2/src/fujin/commands/_base.py +38 -0
- fujin_cli-0.13.2/src/fujin/commands/app.py +205 -0
- fujin_cli-0.13.2/src/fujin/commands/config.py +113 -0
- fujin_cli-0.13.2/src/fujin/commands/deploy.py +270 -0
- fujin_cli-0.13.2/src/fujin/commands/docs.py +14 -0
- fujin_cli-0.13.2/src/fujin/commands/down.py +64 -0
- fujin_cli-0.13.2/src/fujin/commands/init.py +185 -0
- fujin_cli-0.13.2/src/fujin/commands/printenv.py +18 -0
- fujin_cli-0.13.2/src/fujin/commands/prune.py +43 -0
- fujin_cli-0.13.2/src/fujin/commands/rollback.py +50 -0
- fujin_cli-0.13.2/src/fujin/commands/server.py +92 -0
- fujin_cli-0.13.2/src/fujin/commands/up.py +15 -0
- fujin_cli-0.13.2/src/fujin/config.py +290 -0
- fujin_cli-0.13.2/src/fujin/connection.py +73 -0
- fujin_cli-0.13.2/src/fujin/errors.py +5 -0
- fujin_cli-0.13.2/src/fujin/secrets.py +169 -0
- fujin_cli-0.13.2/src/fujin/templates/Caddyfile.j2 +10 -0
- fujin_cli-0.13.2/src/fujin/templates/default.service.j2 +14 -0
- fujin_cli-0.13.2/src/fujin/templates/default.socket.j2 +11 -0
- fujin_cli-0.13.2/src/fujin/templates/default.timer.j2 +9 -0
- fujin_cli-0.13.2/src/fujin/templates/web.service.j2 +27 -0
- fujin_cli-0.13.2/tests/__init__.py +0 -0
- fujin_cli-0.13.2/tests/conftest.py +70 -0
- fujin_cli-0.13.2/tests/integration/Dockerfile +40 -0
- fujin_cli-0.13.2/tests/integration/conftest.py +103 -0
- fujin_cli-0.13.2/tests/integration/test_full_deploy.py +110 -0
- fujin_cli-0.13.2/tests/test_app.py +27 -0
- fujin_cli-0.13.2/tests/test_config.py +152 -0
- fujin_cli-0.13.2/tests/test_deploy.py +509 -0
- fujin_cli-0.13.2/tests/test_down.py +56 -0
- fujin_cli-0.13.2/tests/test_init.py +47 -0
- fujin_cli-0.13.2/tests/test_prune.py +19 -0
- fujin_cli-0.13.2/tests/test_rollback.py +49 -0
- 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
|
+
[](https://github.com/falcopackages/fujin/actions/workflows/publish.yml)
|
|
41
|
+
[](https://pypi.org/project/fujin-cli)
|
|
42
|
+
[](https://pypi.org/project/fujin-cli)
|
|
43
|
+
[](https://github.com/falcopackages/fujin/blob/main/LICENSE.txt)
|
|
44
|
+
[](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
|
+
[](https://github.com/falcopackages/fujin/actions/workflows/publish.yml)
|
|
11
|
+
[](https://pypi.org/project/fujin-cli)
|
|
12
|
+
[](https://pypi.org/project/fujin-cli)
|
|
13
|
+
[](https://github.com/falcopackages/fujin/blob/main/LICENSE.txt)
|
|
14
|
+
[](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 -->
|