Merge branch 'stretch' of https://github.com/bashrc/freedombone
This commit is contained in:
commit
28711ca1e5
|
@ -0,0 +1,92 @@
|
||||||
|
#+TITLE:
|
||||||
|
#+AUTHOR: Bob Mottram
|
||||||
|
#+EMAIL: bob@freedombone.net
|
||||||
|
#+KEYWORDS: freedombox, debian, armbian
|
||||||
|
#+DESCRIPTION: Installing Freedombone on Armbian
|
||||||
|
#+OPTIONS: ^:nil toc:nil
|
||||||
|
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="freedombone.css" />
|
||||||
|
|
||||||
|
#+BEGIN_CENTER
|
||||||
|
[[file:images/logo.png]]
|
||||||
|
#+END_CENTER
|
||||||
|
|
||||||
|
|
||||||
|
#+begin_export html
|
||||||
|
<center><h1>Installing on Armbian</h1></center>
|
||||||
|
#+end_export
|
||||||
|
|
||||||
|
If you have a single board ARM computer which isn't one of the supported ones then you can probably still install Freedombone onto it if it has a [[https://www.armbian.com/download/][Debian Stretch Armbian image]] available for it.
|
||||||
|
|
||||||
|
Download the Armbian image for your board. It must be version 9 (Stretch), otherwise it won't work. Extract the image from its archive, then copy it to a microSD card:
|
||||||
|
|
||||||
|
#+begin_src bash
|
||||||
|
sudo dd if=[Armbian .img file] of=/dev/sdX
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Where */dev/sdX* is the path for the microSD drive on your system.
|
||||||
|
|
||||||
|
When that's done use a tool such as *Gparted* to resize the partition on the microSD card to fill up any remaining available space.
|
||||||
|
|
||||||
|
Insert the microSD drive into your ARM board, connect it to your internet router with an ethernet cable and plug in the power.
|
||||||
|
|
||||||
|
The board should then show up somewhere on your local network. You can log into your internet router to see what devices are connected and obtain the local IP address for the board that way, or use a network scanning tool.
|
||||||
|
|
||||||
|
Once you know the local IP address of your ARM board then you can log into it with:
|
||||||
|
|
||||||
|
#+begin_src bash
|
||||||
|
ssh root@[local IP address]
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Using the default Armbian password of *1234*. You should see the Armbian welcome message and will be asked to change the password, then create a new user account.
|
||||||
|
|
||||||
|
#+BEGIN_CENTER
|
||||||
|
[[file:images/armbian_setup.jpg]]
|
||||||
|
#+END_CENTER
|
||||||
|
|
||||||
|
When the user account is created type *exit* to leave the ssh session then log back in with your new user account.
|
||||||
|
|
||||||
|
#+begin_src bash
|
||||||
|
ssh myusername@[local IP address]
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Become the root user:
|
||||||
|
|
||||||
|
#+begin_src bash
|
||||||
|
sudo su
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Then clone the Freedombone repository and checkout the stretch development branch.
|
||||||
|
|
||||||
|
#+begin_src bash
|
||||||
|
git clone https://github.com/bashrc/freedombone
|
||||||
|
cd freedombone
|
||||||
|
git checkout stretch
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Install the Freedombone commands:
|
||||||
|
|
||||||
|
#+begin_src bash
|
||||||
|
make install
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
And now you can begin installing the Freedombone system. There are two ways of doing this. If you already own a domain name which you want to use then run:
|
||||||
|
|
||||||
|
#+begin_src bash
|
||||||
|
freedombone menuconfig
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Alternatively, if you don't own a domain name, don't have administrator access to your internet router or if you want to be able to access your sites only via onion addresses then run:
|
||||||
|
|
||||||
|
#+begin_src bash
|
||||||
|
freedombone menuconfig-onion
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
You will then be taken through a few questions and the system will install. Afterwards you'll be able to log into your system with:
|
||||||
|
|
||||||
|
#+begin_src bash
|
||||||
|
ssh myusername@freedombone.local -p 2222
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Then select *Administrator options*. If you chose the first install option using a domain name then go to *Show Firewall* and make sure that the ports shown are forwarded from your internet router to your ARM board.
|
||||||
|
|
||||||
|
You can then [[./apps.html][add or remove apps]] as needed.
|
|
@ -31,6 +31,8 @@ And here's how [[./beaglebone.html][on a Beaglebone Black]].
|
||||||
|
|
||||||
Or you can install [[./debianinstall.html][onto an existing Debian system]].
|
Or you can install [[./debianinstall.html][onto an existing Debian system]].
|
||||||
|
|
||||||
|
If you have a single board ARM computer which isn't one of the officially supported ones, such as Raspberry Pi, then you may still be able to install [[./armbian.html][Freedombone with Armbian]].
|
||||||
|
|
||||||
Want to make a community mesh network which doesn't depend upon the internet? The [[./mesh.html][Freedombone Mesh]] is a wireless solution for autonomous communication that can be rapidly deployed in temporary, emergency or post-disaster situations where internet access is unavailable or compromised.
|
Want to make a community mesh network which doesn't depend upon the internet? The [[./mesh.html][Freedombone Mesh]] is a wireless solution for autonomous communication that can be rapidly deployed in temporary, emergency or post-disaster situations where internet access is unavailable or compromised.
|
||||||
|
|
||||||
After installation it's possible that you might want some advice on how to run your system and set up apps to work nicely with it.
|
After installation it's possible that you might want some advice on how to run your system and set up apps to work nicely with it.
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 36 KiB |
|
@ -903,7 +903,7 @@ function install_gnusocial {
|
||||||
|
|
||||||
# Currently Pleroma won't install on ARM systems
|
# Currently Pleroma won't install on ARM systems
|
||||||
# because it uses node-sass which doesn't support ARM
|
# because it uses node-sass which doesn't support ARM
|
||||||
if [[ "$(arch)" == "arm"* ]]; then
|
if [[ "$(arch)" == "arm"* || "$(arch)" == "aarch"* ]]; then
|
||||||
echo -m $'WARNING: Pleroma currently does not support ARM '
|
echo -m $'WARNING: Pleroma currently does not support ARM '
|
||||||
echo $'architecture, so it will not be installed'
|
echo $'architecture, so it will not be installed'
|
||||||
else
|
else
|
||||||
|
|
|
@ -295,10 +295,12 @@ function install_mediagoblin {
|
||||||
function_check install_nodejs
|
function_check install_nodejs
|
||||||
install_nodejs mediagoblin
|
install_nodejs mediagoblin
|
||||||
|
|
||||||
apt-get install -yq python python-dev python-lxml python-imaging python-virtualenv
|
apt-get install -yq python python-dev python-lxml python-imaging python-virtualenv python-setuptools
|
||||||
apt-get install -yq automake perl sqlite python-paste python-pastedeploy python-pastescript
|
apt-get install -yq automake perl sqlite python-paste python-pastedeploy python-pastescript
|
||||||
apt-get install -yq python3 python3-dev libpython3-dev python3-lxml python3-pil
|
apt-get install -yq python3 python3-dev libpython3-dev python3-lxml python3-pil
|
||||||
groupadd mediagoblin
|
groupadd mediagoblin
|
||||||
|
apt-get install -yq python-service-identity python-ndg-httpsclient
|
||||||
|
|
||||||
useradd -c "GNU MediaGoblin system account" -d /var/lib/mediagoblin -m -r -g www-data mediagoblin
|
useradd -c "GNU MediaGoblin system account" -d /var/lib/mediagoblin -m -r -g www-data mediagoblin
|
||||||
usermod --append -G mediagoblin mediagoblin
|
usermod --append -G mediagoblin mediagoblin
|
||||||
mkdir -p /var/lib/mediagoblin
|
mkdir -p /var/lib/mediagoblin
|
||||||
|
|
|
@ -921,7 +921,7 @@ function install_postactiv {
|
||||||
|
|
||||||
# Currently Pleroma won't install on ARM systems
|
# Currently Pleroma won't install on ARM systems
|
||||||
# because it uses node-sass which doesn't support ARM
|
# because it uses node-sass which doesn't support ARM
|
||||||
if [[ "$(arch)" == "arm"* ]]; then
|
if [[ "$(arch)" == "arm"* || "$(arch)" == "aarch"* ]]; then
|
||||||
echo -m $'WARNING: Pleroma currently does not support ARM '
|
echo -m $'WARNING: Pleroma currently does not support ARM '
|
||||||
echo $'architecture, so it will not be installed'
|
echo $'architecture, so it will not be installed'
|
||||||
else
|
else
|
||||||
|
|
|
@ -828,7 +828,8 @@ function install_searx {
|
||||||
|
|
||||||
apt-get -yq install python-pip libyaml-dev python-werkzeug python-babel python-lxml
|
apt-get -yq install python-pip libyaml-dev python-werkzeug python-babel python-lxml
|
||||||
apt-get -yq install git build-essential libxslt-dev python-dev python-virtualenv zlib1g-dev uwsgi uwsgi-plugin-python imagemagick
|
apt-get -yq install git build-essential libxslt-dev python-dev python-virtualenv zlib1g-dev uwsgi uwsgi-plugin-python imagemagick
|
||||||
apt-get -yq install apache2-utils
|
apt-get -yq install apache2-utils python-setuptools
|
||||||
|
apt-get -yq install python-service-identity python-ndg-httpsclient
|
||||||
|
|
||||||
apt-get -yq remove --purge apache2-bin*
|
apt-get -yq remove --purge apache2-bin*
|
||||||
if [ -d /etc/apache2 ]; then
|
if [ -d /etc/apache2 ]; then
|
||||||
|
|
|
@ -29,15 +29,12 @@
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
# Qvitter upstream: https://git.gnu.io/h2p/Qvitter"
|
# Qvitter upstream: https://git.gnu.io/h2p/Qvitter"
|
||||||
QVITTER_THEME_REPO="https://git.postactiv.com/bob/Qvitter"
|
QVITTER_THEME_REPO="https://github.com/bashrc/Qvitter"
|
||||||
QVITTER_THEME_COMMIT='b5791cf935a6391c492cefa1ffa50cc3cea44c12'
|
QVITTER_THEME_COMMIT='c6f09bda4e45be4290cf7409fa5efb4420538032'
|
||||||
|
|
||||||
PLEROMA_REPO="https://gitgud.io/lambadalambda/pleroma-fe"
|
PLEROMA_REPO="https://gitgud.io/lambadalambda/pleroma-fe"
|
||||||
PLEROMA_COMMIT='cbe652f2d94d81fa54a37378b7ff014c4391ca5e'
|
PLEROMA_COMMIT='cbe652f2d94d81fa54a37378b7ff014c4391ca5e'
|
||||||
|
|
||||||
ARMADILLO_REPO="https://git.postactiv.com/maiya/Armadillo"
|
|
||||||
ARMADILLO_COMMIT='ec3938a678f373156c4cbf37926c9a5ab68222c4'
|
|
||||||
|
|
||||||
SHARINGS_REPO="http://git.lasindias.club/bashrc/Sharings"
|
SHARINGS_REPO="http://git.lasindias.club/bashrc/Sharings"
|
||||||
SHARINGS_COMMIT='d5c6c7f855d9afff9086c09ea706f38c859bc0d4'
|
SHARINGS_COMMIT='d5c6c7f855d9afff9086c09ea706f38c859bc0d4'
|
||||||
SHARINGS_THEME_REPO="http://git.lasindias.club/manuel/SharingsTheme"
|
SHARINGS_THEME_REPO="http://git.lasindias.club/manuel/SharingsTheme"
|
||||||
|
@ -163,62 +160,6 @@ function pleroma_set_background_image_from_url {
|
||||||
echo "0"
|
echo "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
function armadillo_set_background_image_from_url {
|
|
||||||
domain_name="$1"
|
|
||||||
url="$2"
|
|
||||||
|
|
||||||
if [ ${#domain_name} -eq 0 ]; then
|
|
||||||
echo "1"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
ext=
|
|
||||||
if [ ${#url} -gt 0 ]; then
|
|
||||||
if [[ "$url" == *".jpeg" || "$url" == *".jpg" ]]; then
|
|
||||||
ext="jpg"
|
|
||||||
fi
|
|
||||||
if [[ "$url" == *".png" ]]; then
|
|
||||||
ext="png"
|
|
||||||
fi
|
|
||||||
if [[ "$url" == *".gif" ]]; then
|
|
||||||
ext="gif"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ${#ext} -gt 0 ]; then
|
|
||||||
cd /var/www/${domain_name}/htdocs
|
|
||||||
|
|
||||||
# remove any existing image
|
|
||||||
if [ -f bg_custom.${ext} ]; then
|
|
||||||
rm bg_custom.${ext}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# get the new image
|
|
||||||
wget "$url" -O bg_custom.${ext}
|
|
||||||
if [ ! -f bg_custom.${ext} ]; then
|
|
||||||
echo "$url"
|
|
||||||
echo $'Custom background image for armadillo could not be downloaded'
|
|
||||||
echo "1"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d /var/www/${domain_name}/htdocs/armadillo ]; then
|
|
||||||
cd /var/www/${domain_name}/htdocs/armadillo
|
|
||||||
cp ../bg_custom.${ext} media/img/bg_custom.${ext}
|
|
||||||
sed -i "s|\"background\":.*|\"background\": \"armadillo/media/img/background.jpeg\"," config.json
|
|
||||||
fi
|
|
||||||
|
|
||||||
qvitter_update_background ${domain_name} ${ext}
|
|
||||||
|
|
||||||
rm bg_custom.${ext}
|
|
||||||
else
|
|
||||||
echo "2"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "0"
|
|
||||||
}
|
|
||||||
|
|
||||||
function install_qvitter {
|
function install_qvitter {
|
||||||
domain_name=$1
|
domain_name=$1
|
||||||
app_name=$2
|
app_name=$2
|
||||||
|
@ -260,6 +201,11 @@ function install_qvitter {
|
||||||
git_clone $QVITTER_THEME_REPO Qvitter
|
git_clone $QVITTER_THEME_REPO Qvitter
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ ! -d /var/www/${domain_name}/htdocs/local/plugins/Qvitter ]; then
|
||||||
|
echo $'Qvitter repo was not installed'
|
||||||
|
exit 835638
|
||||||
|
fi
|
||||||
|
|
||||||
cd /var/www/${domain_name}/htdocs/local/plugins/Qvitter
|
cd /var/www/${domain_name}/htdocs/local/plugins/Qvitter
|
||||||
git checkout $QVITTER_THEME_COMMIT -b $QVITTER_THEME_COMMIT
|
git checkout $QVITTER_THEME_COMMIT -b $QVITTER_THEME_COMMIT
|
||||||
|
|
||||||
|
@ -329,48 +275,6 @@ function install_gnusocial_default_background {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function install_armadillo_front_end {
|
|
||||||
app_name="$1"
|
|
||||||
armadillo_domain="$2"
|
|
||||||
background_url="$3"
|
|
||||||
|
|
||||||
if [ ! -d $INSTALL_DIR/armadillo ]; then
|
|
||||||
function_check git_clone
|
|
||||||
git_clone $ARMADILLO_REPO $INSTALL_DIR/armadillo
|
|
||||||
if [ ! -d $INSTALL_DIR/armadillo ]; then
|
|
||||||
echo $'Unable to clone armadillo repo'
|
|
||||||
exit 35722
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd $INSTALL_DIR/armadillo
|
|
||||||
git checkout $ARMADILLO_COMMIT -b $ARMADILLO_COMMIT
|
|
||||||
set_completion_param "${app_name} armadillo commit" "$ARMADILLO_COMMIT"
|
|
||||||
|
|
||||||
cp armadillo/config.json.example armadillo/config.json
|
|
||||||
if [[ $ONION_ONLY == 'no' ]]; then
|
|
||||||
sed -i "s|\"server\".*|\"server\": \"https://${armadillo_domain}\",|g" armadillo/config.json
|
|
||||||
else
|
|
||||||
sed -i "s|\"server\".*|\"server\": \"http://${armadillo_domain}\",|g" armadillo/config.json
|
|
||||||
fi
|
|
||||||
owner='<a href=\\"'"https://${armadillo_domain}/$MY_USERNAME"'\\">@'"$MY_USERNAME@${armadillo_domain}"'</a>'
|
|
||||||
sed -i "s|\"owner\".*|\"owner\": \"$owner\",|g" armadillo/config.json
|
|
||||||
cp -r $INSTALL_DIR/armadillo/armadillo /var/www/${armadillo_domain}/htdocs/
|
|
||||||
cp $INSTALL_DIR/armadillo/armadillo.html /var/www/${armadillo_domain}/htdocs/index.html
|
|
||||||
cp $INSTALL_DIR/armadillo/dash.html /var/www/${armadillo_domain}/htdocs/dash.html
|
|
||||||
|
|
||||||
armadillo_set_background_image_from_url "$armadillo_domain" "$background_url"
|
|
||||||
|
|
||||||
nginx_site=/etc/nginx/sites-available/${armadillo_domain}
|
|
||||||
sed -i 's|index index.php;|index index.html;|g' $nginx_site
|
|
||||||
|
|
||||||
if [ -f /var/www/${armadillo_domain}/htdocs/index.php ]; then
|
|
||||||
mv /var/www/${armadillo_domain}/htdocs/index.php /var/www/${armadillo_domain}/htdocs/index_qvitter.php
|
|
||||||
fi
|
|
||||||
sed -i 's|index.php|index_qvitter.php|g' $nginx_site
|
|
||||||
|
|
||||||
chown -R www-data:www-data /var/www/${armadillo_domain}/htdocs
|
|
||||||
}
|
|
||||||
|
|
||||||
function install_pleroma_front_end {
|
function install_pleroma_front_end {
|
||||||
app_name="$1"
|
app_name="$1"
|
||||||
|
@ -489,27 +393,6 @@ function upgrade_pleroma {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function upgrade_armadillo {
|
|
||||||
domain_name="$1"
|
|
||||||
app_name="$2"
|
|
||||||
background_url="$3"
|
|
||||||
|
|
||||||
if [ -d $INSTALL_DIR/armadillo ]; then
|
|
||||||
set_repo_commit $INSTALL_DIR/armadillo "${app_name} armadillo commit" "$ARMADILLO_COMMIT" $ARMADILLO_REPO
|
|
||||||
cd $INSTALL_DIR/armadillo
|
|
||||||
|
|
||||||
if [ -f $INSTALL_DIR/armadillo/armadillo/config.json ]; then
|
|
||||||
rm $INSTALL_DIR/armadillo/armadillo/config.json
|
|
||||||
fi
|
|
||||||
cp -r $INSTALL_DIR/armadillo/armadillo /var/www/${armadillo_domain}/htdocs/
|
|
||||||
cp $INSTALL_DIR/armadillo/armadillo.html /var/www/${armadillo_domain}/htdocs/index.html
|
|
||||||
cp $INSTALL_DIR/armadillo/dash.html /var/www/${armadillo_domain}/htdocs/dash.html
|
|
||||||
chown -R www-data:www-data /var/www/${domain_name}/htdocs
|
|
||||||
else
|
|
||||||
install_armadillo_front_end "${app_name}" "${domain_name}" "${background_url}"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function gnusocial_hourly_script {
|
function gnusocial_hourly_script {
|
||||||
gnusocial_type=$1
|
gnusocial_type=$1
|
||||||
domain_name=$2
|
domain_name=$2
|
||||||
|
@ -900,42 +783,6 @@ function gnusocial_use_pleroma {
|
||||||
systemctl restart nginx
|
systemctl restart nginx
|
||||||
}
|
}
|
||||||
|
|
||||||
function gnusocial_use_armadillo {
|
|
||||||
database_name=$1
|
|
||||||
|
|
||||||
domain_name=$(get_completion_param "$database_name domain")
|
|
||||||
|
|
||||||
if [ ! -d /var/www/$domain_name/htdocs/armadillo ]; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f /var/www/$domain_name/htdocs/index.php ]; then
|
|
||||||
mv /var/www/$domain_name/htdocs/index.php /var/www/$domain_name/htdocs/index_qvitter.php
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f /etc/nginx/sites-available/$domain_name ]; then
|
|
||||||
sed -i 's|index.php|index_qvitter.php|g' /etc/nginx/sites-available/$domain_name
|
|
||||||
sed -i 's|index index_qvitter.php|index index.html|g' /etc/nginx/sites-available/$domain_name
|
|
||||||
fi
|
|
||||||
|
|
||||||
if grep -q "//addPlugin('Qvitter')" /var/www/$domain_name/htdocs/config.php; then
|
|
||||||
sed -i "s|//addPlugin('Qvitter')|addPlugin('Qvitter')|g" /var/www/$domain_name/htdocs/config.php
|
|
||||||
fi
|
|
||||||
if grep -q "// addPlugin('Qvitter')" /var/www/$domain_name/htdocs/config.php; then
|
|
||||||
sed -i "s|// addPlugin('Qvitter')|addPlugin('Qvitter')|g" /var/www/$domain_name/htdocs/config.php
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f $INSTALL_DIR/armadillo/armadillo/config.json ]; then
|
|
||||||
rm $INSTALL_DIR/armadillo/armadillo/config.json
|
|
||||||
fi
|
|
||||||
cp -r $INSTALL_DIR/armadillo/armadillo/* /var/www/${domain_name}/htdocs/armadillo
|
|
||||||
cp $INSTALL_DIR/armadillo/armadillo.html /var/www/${domain_name}/htdocs/index.html
|
|
||||||
cp $INSTALL_DIR/armadillo/dash.html /var/www/${domain_name}/htdocs/dash.html
|
|
||||||
chown -R www-data:www-data /var/www/${domain_name}/htdocs
|
|
||||||
|
|
||||||
systemctl restart nginx
|
|
||||||
}
|
|
||||||
|
|
||||||
function install_gnusocial_plugin_sharings {
|
function install_gnusocial_plugin_sharings {
|
||||||
domain_name=$1
|
domain_name=$1
|
||||||
social_app_name=$2
|
social_app_name=$2
|
||||||
|
|
|
@ -61,8 +61,12 @@ function get_npm_arch {
|
||||||
}
|
}
|
||||||
|
|
||||||
function mesh_install_nodejs {
|
function mesh_install_nodejs {
|
||||||
chroot "$rootdir" apt-get -yq install g++ m4 libtool automake nodejs curl
|
mesh_install_nodejs_prefix=
|
||||||
chroot "$rootdir" apt-get -yq install libxext-dev libxtst-dev libxkbfile-dev
|
if [ $rootdir ]; then
|
||||||
|
mesh_install_nodejs_prefix="chroot $rootdir"
|
||||||
|
fi
|
||||||
|
$mesh_install_nodejs_prefix apt-get -yq install g++ m4 libtool automake nodejs curl
|
||||||
|
$mesh_install_nodejs_prefix apt-get -yq install libxext-dev libxtst-dev libxkbfile-dev
|
||||||
|
|
||||||
if [ ! -f ${rootdir}/usr/bin/nodejs ]; then
|
if [ ! -f ${rootdir}/usr/bin/nodejs ]; then
|
||||||
echo $'nodejs was not installed'
|
echo $'nodejs was not installed'
|
||||||
|
@ -83,9 +87,9 @@ function mesh_install_nodejs {
|
||||||
echo $'Unable to download npm installer'
|
echo $'Unable to download npm installer'
|
||||||
exit 8793636
|
exit 8793636
|
||||||
fi
|
fi
|
||||||
chroot "$rootdir" chmod +x /root/npm_install.sh
|
$mesh_install_nodejs_prefix chmod +x /root/npm_install.sh
|
||||||
sed -i "s|t=\"\${npm_install}\"|t=\"$NPM_VERSION\"|g" $rootdir/root/npm_install.sh
|
sed -i "s|t=\"\${npm_install}\"|t=\"$NPM_VERSION\"|g" $rootdir/root/npm_install.sh
|
||||||
chroot "$rootdir" /root/npm_install.sh
|
$mesh_install_nodejs_prefix /root/npm_install.sh
|
||||||
|
|
||||||
if [ ! -f $rootdir/usr/bin/npm ]; then
|
if [ ! -f $rootdir/usr/bin/npm ]; then
|
||||||
echo $'npm was not installed'
|
echo $'npm was not installed'
|
||||||
|
@ -95,8 +99,8 @@ function mesh_install_nodejs {
|
||||||
|
|
||||||
# update from the old debian nodejs version
|
# update from the old debian nodejs version
|
||||||
get_npm_arch
|
get_npm_arch
|
||||||
chroot "$rootdir" npm install --arch=$NPM_ARCH -g n@${NODEJS_N_VERSION} --save
|
$mesh_install_nodejs_prefix npm install --arch=$NPM_ARCH -g n@${NODEJS_N_VERSION} --save
|
||||||
chroot "$rootdir" n --arch $N_ARCH ${NODEJS_VERSION}
|
$mesh_install_nodejs_prefix n --arch $N_ARCH ${NODEJS_VERSION}
|
||||||
cp $rootdir/root/npm $rootdir/usr/bin/npm
|
cp $rootdir/root/npm $rootdir/usr/bin/npm
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ function enforce_good_passwords {
|
||||||
}
|
}
|
||||||
|
|
||||||
function create_password {
|
function create_password {
|
||||||
openssl rand -base64 32 | tr -dc A-Za-z0-9 | head -c ${1} ; echo ''
|
openssl rand -base64 32 | tr -dc A-Za-z0-9 | head -c ${1} ; echo -n ''
|
||||||
}
|
}
|
||||||
|
|
||||||
# NOTE: deliberately no exit 0
|
# NOTE: deliberately no exit 0
|
||||||
|
|
|
@ -0,0 +1,398 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||||
|
<head>
|
||||||
|
<!-- 2017-09-20 Wed 20:03 -->
|
||||||
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<title>‎</title>
|
||||||
|
<meta name="generator" content="Org mode" />
|
||||||
|
<meta name="author" content="Bob Mottram" />
|
||||||
|
<meta name="description" content="Installing Freedombone on Armbian"
|
||||||
|
/>
|
||||||
|
<meta name="keywords" content="freedombox, debian, armbian" />
|
||||||
|
<style type="text/css">
|
||||||
|
<!--/*--><![CDATA[/*><!--*/
|
||||||
|
.title { text-align: center;
|
||||||
|
margin-bottom: .2em; }
|
||||||
|
.subtitle { text-align: center;
|
||||||
|
font-size: medium;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-top:0; }
|
||||||
|
.todo { font-family: monospace; color: red; }
|
||||||
|
.done { font-family: monospace; color: green; }
|
||||||
|
.priority { font-family: monospace; color: orange; }
|
||||||
|
.tag { background-color: #eee; font-family: monospace;
|
||||||
|
padding: 2px; font-size: 80%; font-weight: normal; }
|
||||||
|
.timestamp { color: #bebebe; }
|
||||||
|
.timestamp-kwd { color: #5f9ea0; }
|
||||||
|
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
|
||||||
|
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
|
||||||
|
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
|
||||||
|
.underline { text-decoration: underline; }
|
||||||
|
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
|
||||||
|
p.verse { margin-left: 3%; }
|
||||||
|
pre {
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
box-shadow: 3px 3px 3px #eee;
|
||||||
|
padding: 8pt;
|
||||||
|
font-family: monospace;
|
||||||
|
overflow: auto;
|
||||||
|
margin: 1.2em;
|
||||||
|
}
|
||||||
|
pre.src {
|
||||||
|
position: relative;
|
||||||
|
overflow: visible;
|
||||||
|
padding-top: 1.2em;
|
||||||
|
}
|
||||||
|
pre.src:before {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
background-color: white;
|
||||||
|
top: -10px;
|
||||||
|
right: 10px;
|
||||||
|
padding: 3px;
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
pre.src:hover:before { display: inline;}
|
||||||
|
/* Languages per Org manual */
|
||||||
|
pre.src-asymptote:before { content: 'Asymptote'; }
|
||||||
|
pre.src-awk:before { content: 'Awk'; }
|
||||||
|
pre.src-C:before { content: 'C'; }
|
||||||
|
/* pre.src-C++ doesn't work in CSS */
|
||||||
|
pre.src-clojure:before { content: 'Clojure'; }
|
||||||
|
pre.src-css:before { content: 'CSS'; }
|
||||||
|
pre.src-D:before { content: 'D'; }
|
||||||
|
pre.src-ditaa:before { content: 'ditaa'; }
|
||||||
|
pre.src-dot:before { content: 'Graphviz'; }
|
||||||
|
pre.src-calc:before { content: 'Emacs Calc'; }
|
||||||
|
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
|
||||||
|
pre.src-fortran:before { content: 'Fortran'; }
|
||||||
|
pre.src-gnuplot:before { content: 'gnuplot'; }
|
||||||
|
pre.src-haskell:before { content: 'Haskell'; }
|
||||||
|
pre.src-hledger:before { content: 'hledger'; }
|
||||||
|
pre.src-java:before { content: 'Java'; }
|
||||||
|
pre.src-js:before { content: 'Javascript'; }
|
||||||
|
pre.src-latex:before { content: 'LaTeX'; }
|
||||||
|
pre.src-ledger:before { content: 'Ledger'; }
|
||||||
|
pre.src-lisp:before { content: 'Lisp'; }
|
||||||
|
pre.src-lilypond:before { content: 'Lilypond'; }
|
||||||
|
pre.src-lua:before { content: 'Lua'; }
|
||||||
|
pre.src-matlab:before { content: 'MATLAB'; }
|
||||||
|
pre.src-mscgen:before { content: 'Mscgen'; }
|
||||||
|
pre.src-ocaml:before { content: 'Objective Caml'; }
|
||||||
|
pre.src-octave:before { content: 'Octave'; }
|
||||||
|
pre.src-org:before { content: 'Org mode'; }
|
||||||
|
pre.src-oz:before { content: 'OZ'; }
|
||||||
|
pre.src-plantuml:before { content: 'Plantuml'; }
|
||||||
|
pre.src-processing:before { content: 'Processing.js'; }
|
||||||
|
pre.src-python:before { content: 'Python'; }
|
||||||
|
pre.src-R:before { content: 'R'; }
|
||||||
|
pre.src-ruby:before { content: 'Ruby'; }
|
||||||
|
pre.src-sass:before { content: 'Sass'; }
|
||||||
|
pre.src-scheme:before { content: 'Scheme'; }
|
||||||
|
pre.src-screen:before { content: 'Gnu Screen'; }
|
||||||
|
pre.src-sed:before { content: 'Sed'; }
|
||||||
|
pre.src-sh:before { content: 'shell'; }
|
||||||
|
pre.src-sql:before { content: 'SQL'; }
|
||||||
|
pre.src-sqlite:before { content: 'SQLite'; }
|
||||||
|
/* additional languages in org.el's org-babel-load-languages alist */
|
||||||
|
pre.src-forth:before { content: 'Forth'; }
|
||||||
|
pre.src-io:before { content: 'IO'; }
|
||||||
|
pre.src-J:before { content: 'J'; }
|
||||||
|
pre.src-makefile:before { content: 'Makefile'; }
|
||||||
|
pre.src-maxima:before { content: 'Maxima'; }
|
||||||
|
pre.src-perl:before { content: 'Perl'; }
|
||||||
|
pre.src-picolisp:before { content: 'Pico Lisp'; }
|
||||||
|
pre.src-scala:before { content: 'Scala'; }
|
||||||
|
pre.src-shell:before { content: 'Shell Script'; }
|
||||||
|
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
|
||||||
|
/* additional language identifiers per "defun org-babel-execute"
|
||||||
|
in ob-*.el */
|
||||||
|
pre.src-cpp:before { content: 'C++'; }
|
||||||
|
pre.src-abc:before { content: 'ABC'; }
|
||||||
|
pre.src-coq:before { content: 'Coq'; }
|
||||||
|
pre.src-groovy:before { content: 'Groovy'; }
|
||||||
|
/* additional language identifiers from org-babel-shell-names in
|
||||||
|
ob-shell.el: ob-shell is the only babel language using a lambda to put
|
||||||
|
the execution function name together. */
|
||||||
|
pre.src-bash:before { content: 'bash'; }
|
||||||
|
pre.src-csh:before { content: 'csh'; }
|
||||||
|
pre.src-ash:before { content: 'ash'; }
|
||||||
|
pre.src-dash:before { content: 'dash'; }
|
||||||
|
pre.src-ksh:before { content: 'ksh'; }
|
||||||
|
pre.src-mksh:before { content: 'mksh'; }
|
||||||
|
pre.src-posh:before { content: 'posh'; }
|
||||||
|
/* Additional Emacs modes also supported by the LaTeX listings package */
|
||||||
|
pre.src-ada:before { content: 'Ada'; }
|
||||||
|
pre.src-asm:before { content: 'Assembler'; }
|
||||||
|
pre.src-caml:before { content: 'Caml'; }
|
||||||
|
pre.src-delphi:before { content: 'Delphi'; }
|
||||||
|
pre.src-html:before { content: 'HTML'; }
|
||||||
|
pre.src-idl:before { content: 'IDL'; }
|
||||||
|
pre.src-mercury:before { content: 'Mercury'; }
|
||||||
|
pre.src-metapost:before { content: 'MetaPost'; }
|
||||||
|
pre.src-modula-2:before { content: 'Modula-2'; }
|
||||||
|
pre.src-pascal:before { content: 'Pascal'; }
|
||||||
|
pre.src-ps:before { content: 'PostScript'; }
|
||||||
|
pre.src-prolog:before { content: 'Prolog'; }
|
||||||
|
pre.src-simula:before { content: 'Simula'; }
|
||||||
|
pre.src-tcl:before { content: 'tcl'; }
|
||||||
|
pre.src-tex:before { content: 'TeX'; }
|
||||||
|
pre.src-plain-tex:before { content: 'Plain TeX'; }
|
||||||
|
pre.src-verilog:before { content: 'Verilog'; }
|
||||||
|
pre.src-vhdl:before { content: 'VHDL'; }
|
||||||
|
pre.src-xml:before { content: 'XML'; }
|
||||||
|
pre.src-nxml:before { content: 'XML'; }
|
||||||
|
/* add a generic configuration mode; LaTeX export needs an additional
|
||||||
|
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
|
||||||
|
pre.src-conf:before { content: 'Configuration File'; }
|
||||||
|
|
||||||
|
table { border-collapse:collapse; }
|
||||||
|
caption.t-above { caption-side: top; }
|
||||||
|
caption.t-bottom { caption-side: bottom; }
|
||||||
|
td, th { vertical-align:top; }
|
||||||
|
th.org-right { text-align: center; }
|
||||||
|
th.org-left { text-align: center; }
|
||||||
|
th.org-center { text-align: center; }
|
||||||
|
td.org-right { text-align: right; }
|
||||||
|
td.org-left { text-align: left; }
|
||||||
|
td.org-center { text-align: center; }
|
||||||
|
dt { font-weight: bold; }
|
||||||
|
.footpara { display: inline; }
|
||||||
|
.footdef { margin-bottom: 1em; }
|
||||||
|
.figure { padding: 1em; }
|
||||||
|
.figure p { text-align: center; }
|
||||||
|
.inlinetask {
|
||||||
|
padding: 10px;
|
||||||
|
border: 2px solid gray;
|
||||||
|
margin: 10px;
|
||||||
|
background: #ffffcc;
|
||||||
|
}
|
||||||
|
#org-div-home-and-up
|
||||||
|
{ text-align: right; font-size: 70%; white-space: nowrap; }
|
||||||
|
textarea { overflow-x: auto; }
|
||||||
|
.linenr { font-size: smaller }
|
||||||
|
.code-highlighted { background-color: #ffff00; }
|
||||||
|
.org-info-js_info-navigation { border-style: none; }
|
||||||
|
#org-info-js_console-label
|
||||||
|
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
|
||||||
|
.org-info-js_search-highlight
|
||||||
|
{ background-color: #ffff00; color: #000000; font-weight: bold; }
|
||||||
|
.org-svg { width: 90%; }
|
||||||
|
/*]]>*/-->
|
||||||
|
</style>
|
||||||
|
<link rel="stylesheet" type="text/css" href="freedombone.css" />
|
||||||
|
<script type="text/javascript">
|
||||||
|
/*
|
||||||
|
@licstart The following is the entire license notice for the
|
||||||
|
JavaScript code in this tag.
|
||||||
|
|
||||||
|
Copyright (C) 2012-2017 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
The JavaScript code in this tag is free software: you can
|
||||||
|
redistribute it and/or modify it under the terms of the GNU
|
||||||
|
General Public License (GNU GPL) as published by the Free Software
|
||||||
|
Foundation, either version 3 of the License, or (at your option)
|
||||||
|
any later version. The code is distributed WITHOUT ANY WARRANTY;
|
||||||
|
without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
|
||||||
|
|
||||||
|
As additional permission under GNU GPL version 3 section 7, you
|
||||||
|
may distribute non-source (e.g., minimized or compacted) forms of
|
||||||
|
that code without the copy of the GNU GPL normally required by
|
||||||
|
section 4, provided you include this license notice and a URL
|
||||||
|
through which recipients can access the Corresponding Source.
|
||||||
|
|
||||||
|
|
||||||
|
@licend The above is the entire license notice
|
||||||
|
for the JavaScript code in this tag.
|
||||||
|
*/
|
||||||
|
<!--/*--><![CDATA[/*><!--*/
|
||||||
|
function CodeHighlightOn(elem, id)
|
||||||
|
{
|
||||||
|
var target = document.getElementById(id);
|
||||||
|
if(null != target) {
|
||||||
|
elem.cacheClassElem = elem.className;
|
||||||
|
elem.cacheClassTarget = target.className;
|
||||||
|
target.className = "code-highlighted";
|
||||||
|
elem.className = "code-highlighted";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function CodeHighlightOff(elem, id)
|
||||||
|
{
|
||||||
|
var target = document.getElementById(id);
|
||||||
|
if(elem.cacheClassElem)
|
||||||
|
elem.className = elem.cacheClassElem;
|
||||||
|
if(elem.cacheClassTarget)
|
||||||
|
target.className = elem.cacheClassTarget;
|
||||||
|
}
|
||||||
|
/*]]>*///-->
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="preamble" class="status">
|
||||||
|
<a name="top" id="top"></a>
|
||||||
|
</div>
|
||||||
|
<div id="content">
|
||||||
|
<div class="org-center">
|
||||||
|
|
||||||
|
<div class="figure">
|
||||||
|
<p><img src="images/logo.png" alt="logo.png" />
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<center><h1>Installing on Armbian</h1></center>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
If you have a single board ARM computer which isn't one of the supported ones then you can probably still install Freedombone onto it if it has a <a href="https://www.armbian.com/download/">Debian Stretch Armbian image</a> available for it.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Download the Armbian image for your board. It must be version 9 (Stretch), otherwise it won't work. Extract the image from its archive, then copy it to a microSD card:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-bash">sudo dd <span class="org-variable-name">if</span>=[Armbian .img file] <span class="org-variable-name">of</span>=/dev/sdX
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Where <b>/dev/sdX</b> is the path for the microSD drive on your system.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
When that's done use a tool such as <b>Gparted</b> to resize the partition on the microSD card to fill up any remaining available space.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Insert the microSD drive into your ARM board, connect it to your internet router with an ethernet cable and plug in the power.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The board should then show up somewhere on your local network. You can log into your internet router to see what devices are connected and obtain the local IP address for the board that way, or use a network scanning tool.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Once you know the local IP address of your ARM board then you can log into it with:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-bash">ssh root@[local IP address]
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Using the default Armbian password of <b>1234</b>. You should see the Armbian welcome message and will be asked to change the password, then create a new user account.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="org-center">
|
||||||
|
|
||||||
|
<div class="figure">
|
||||||
|
<p><img src="images/armbian_setup.jpg" alt="armbian_setup.jpg" />
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
When the user account is created type <b>exit</b> to leave the ssh session then log back in with your new user account.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-bash">ssh myusername@[local IP address]
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Become the root user:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-bash">sudo su
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Then clone the Freedombone repository and checkout the stretch development branch.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-bash">git clone https://github.com/bashrc/freedombone
|
||||||
|
<span class="org-builtin">cd</span> freedombone
|
||||||
|
git checkout stretch
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Install the Freedombone commands:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-bash">make install
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
And now you can begin installing the Freedombone system. There are two ways of doing this. If you already own a domain name which you want to use then run:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-bash">freedombone menuconfig
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Alternatively, if you don't own a domain name, don't have administrator access to your internet router or if you want to be able to access your sites only via onion addresses then run:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-bash">freedombone menuconfig-onion
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
You will then be taken through a few questions and the system will install. Afterwards you'll be able to log into your system with:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-bash">ssh myusername@freedombone.local -p 2222
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Then select <b>Administrator options</b>. If you chose the first install option using a domain name then go to <b>Show Firewall</b> and make sure that the ports shown are forwarded from your internet router to your ARM board.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
You can then <a href="./apps.html">add or remove apps</a> as needed.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div id="postamble" class="status">
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
.back-to-top {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 2em;
|
||||||
|
right: 0px;
|
||||||
|
text-decoration: none;
|
||||||
|
color: #000000;
|
||||||
|
background-color: rgba(235, 235, 235, 0.80);
|
||||||
|
font-size: 12px;
|
||||||
|
padding: 1em;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.back-to-top:hover {
|
||||||
|
background-color: rgba(135, 135, 135, 0.50);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div class="back-to-top">
|
||||||
|
<a href="#top">Back to top</a> | <a href="mailto:bob@freedombone.net">E-mail me</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -3,10 +3,10 @@
|
||||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||||
<head>
|
<head>
|
||||||
<!-- 2017-07-20 Thu 14:24 -->
|
<!-- 2017-09-20 Wed 19:14 -->
|
||||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<title></title>
|
<title>‎</title>
|
||||||
<meta name="generator" content="Org mode" />
|
<meta name="generator" content="Org mode" />
|
||||||
<meta name="author" content="Bob Mottram" />
|
<meta name="author" content="Bob Mottram" />
|
||||||
<meta name="description" content="Turn the Beaglebone Black into a personal communications server"
|
<meta name="description" content="Turn the Beaglebone Black into a personal communications server"
|
||||||
|
@ -275,6 +275,10 @@ And here's how <a href="./beaglebone.html">on a Beaglebone Black</a>.
|
||||||
Or you can install <a href="./debianinstall.html">onto an existing Debian system</a>.
|
Or you can install <a href="./debianinstall.html">onto an existing Debian system</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
If you have a single board ARM computer which isn't one of the officially supported ones, such as Raspberry Pi, then you may still be able to install <a href="./armbian.html">Freedombone with Armbian</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Want to make a community mesh network which doesn't depend upon the internet? The <a href="./mesh.html">Freedombone Mesh</a> is a wireless solution for autonomous communication that can be rapidly deployed in temporary, emergency or post-disaster situations where internet access is unavailable or compromised.
|
Want to make a community mesh network which doesn't depend upon the internet? The <a href="./mesh.html">Freedombone Mesh</a> is a wireless solution for autonomous communication that can be rapidly deployed in temporary, emergency or post-disaster situations where internet access is unavailable or compromised.
|
||||||
</p>
|
</p>
|
||||||
|
|
Loading…
Reference in New Issue